2017-03-19 35 views
0

我想使用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和一次过程中。

回答

2

一个不能防止着色器写入全部输出它已附加。你的代码所做的是赋值给一个输出,但另一个仍然写入。

如果您只希望在其中一个附件中看到可见的输出,您可以为输出写入完全透明的颜色并启用alpha混合。

+0

请注意,如果ID是统一的而不是输入,则可以使用写入掩码关闭对这些特定缓冲区的写入。 –

+0

感谢您的回复,我现在就试试。但看起来有点浪费... –

+0

一个新的问题....正如您所说,如果着色器将写入所有输出,左侧和右侧将不会是相同的颜色三角形,它将是'橙''红'和'红''橙'。那么,'if'陈述是否无效? –