用2个着色器渲染两个重叠的2D对象
Rendering two overlapping 2D objects with 2 shaders
我想渲染两个蓝色的三角形和一个红色的风车。为了做到这一点,我创建了2个着色器,除了颜色之外都是一样的。这两个三角形比"风车"大得多。我面临的问题是,如果我在着色器之间切换,只有最后一个对象将被渲染。如果我切换到只使用一个着色器,两个对象都将被绘制,但我几乎看不到"风车",因为相同的颜色。所以我的问题是如何用两个着色器绘制两个对象?(我知道我可以把颜色传递给片段着色器,但我不想那样做)。
渲染循环:
GLint index, index2;
index = glGetUniformLocation(shaders[LINE], "projectionMatrix");
index2 = glGetUniformLocation(shaders[TRIANGLE], "projectionMatrix");
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix));
glUniformMatrix3fv(index2, 1, true, value_ptr(projectionMatrix));
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaders[TRIANGLE]);
glBindVertexArray(vaos[TRIANGLE]);
glDrawArrays(GL_TRIANGLES, 0, tbufindex/sizeof(glm::vec3));
glUseProgram(shaders[LINE]); // If I comment out this line both objects will be drawn
glBindVertexArray(vaos[LINE]);
glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices_position)/sizeof(glm::vec3));
/Triangle.vert行:
#version 450
layout (location = 0) in vec3 vPosition;
uniform mat3 projectionMatrix;
void main()
{
vec3 tmp = projectionMatrix*vPosition;
gl_Position = vec4(tmp, 1.0f);
}
/triangle.frag行:
#version 450
in vec4 gl_FragCoord;
out vec4 fColor;
void main()
{
fColor = vec4(0.0, 0.0, 1.0, 1.0);
}
还请注意,我没有GL_DEPTH_TEST启用,我使用2D坐标。
编辑职位:
triangles[2] = { { vec3(-0.90f, -0.90f, 1.0f), vec3(0.85f, -0.90f, 1.0f), vec3(-0.90f, 0.85f, 1.0f) },
{ vec3(0.90f, -0.85f, 1.0f), vec3(0.90f, 0.90f, 1.0f), vec3(-0.85f, 0.90f, 1.0f) } };
lines[39] = {
0.0f, 0.0f, 1.0f,
0.5f, 0.0f, 1.0f,
0.5f, 0.5f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, 0.5f, 1.0f,
-0.5f, 0.5f, 1.0f,
0.0f, 0.0f, 1.0f,
-0.5f, 0.0f, 1.0f,
-0.5f, -0.5f, 1.0f,
0.0f, 0.0f, 1.0f,
0.0f, -0.5f, 1.0f,
0.5f, -0.5f, 1.0f,
0.0f, 0.0f, 1.0f
};
glUniform..()
必须在绑定程序(源代码)后调用。所以下面的代码应该可以工作:
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaders[TRIANGLE]);
glUniformMatrix3fv(index2, 1, true, value_ptr(projectionMatrix));
glBindVertexArray(vaos[TRIANGLE]);
glDrawArrays(GL_TRIANGLES, 0, tbufindex/sizeof(glm::vec3));
glUseProgram(shaders[LINE]); // If I comment out this line both objects will be drawn
glUniformMatrix3fv(index, 1, true, value_ptr(projectionMatrix));
glBindVertexArray(vaos[LINE]);
glDrawArrays(GL_LINE_STRIP, 0, sizeof(vertices_position)/sizeof(glm::vec3));
相关文章:
- 如何在C++中从两个单独的for循环中添加两个数组
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 当在同一名称空间中有两个具有相同签名的函数时,会发生什么
- Ardunio UNO解决了多个重叠的定时器循环
- 如何返回一个类的两个对象相加的结果
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 如何在c/c++中检查两个任意内存范围是否重叠
- Qt-grabtoimage()和scale生成两个重叠的图像
- 检查两个矩形是否重叠或边缘是否接触
- 在给定两个区间列表的情况下,得到重叠区间的数量
- 重叠分数在两个BB之间
- 找到最多2笔交易可以赚的最高金额(在列表中找到两个最大的非重叠增长)
- 如何在c++中检查两个或多个时间段是否重叠
- 计算碰撞中两个正方形的重叠
- 在cocos2d-xv3.2中相交或重叠的两个动力学体
- 使用重叠的关键帧合并两个未定义的贴图
- 如何确定一组矩形是否包含两个重叠区域
- C++ 创建两个具有重叠内存的变量
- 用2个着色器渲染两个重叠的2D对象
- 两个重叠的互斥锁会导致死锁吗?