在fragmentShader中输出数据时切换布局位置
问题描述:
我想使用glDrawArraysInstanced函数来加三角形。 两者的区别在于MVP矩阵。 然后我应用一个FBO 2 GL_COLOR_ATTACHMENT,并激活glDrawBuffers(2,...)。在fragmentShader中输出数据时切换布局位置
我的顶点着色器:
#version 430 core
layout (location = 0) in vec3 position;
uniform mat4 uModel;
uniform mat4 uView[2];
uniform mat4 uProjection[2];
out flat int ID;
void main()
{
gl_Position = uProjection[gl_InstanceID] * uView[gl_InstanceID] * uModel * vec4(position.x, position.y, position.z, 1.0);
ID = gl_InstanceID;
}
我的片段着色器:
#version 430 core
layout (location = 0) out vec3 color;
layout (location = 1) out vec3 color1;
in flat int ID;
void main()
{
if (ID == 0) color = vec3(1.0f, 0.5f, 0.2f);
if (ID == 1) color1 = vec3(1.0f, 0.0f, 0.0f);
}
结果是: 4 triangles..
看来,每个实例化有实施的颜色和color1语句。 那么,'if'语句是否无效? 而我的问题是如何限制输出目标在fbo和一次过程中。
答
一个不能防止着色器写入全部输出它已附加。你的代码所做的是将赋值给一个输出,但另一个仍然写入。
如果您只希望在其中一个附件中看到可见的输出,您可以为输出写入完全透明的颜色并启用alpha混合。
请注意,如果ID是统一的而不是输入,则可以使用写入掩码关闭对这些特定缓冲区的写入。 –
感谢您的回复,我现在就试试。但看起来有点浪费... –
一个新的问题....正如您所说,如果着色器将写入所有输出,左侧和右侧将不会是相同的颜色三角形,它将是'橙''红'和'红''橙'。那么,'if'陈述是否无效? –