在fragmentShader中输出数据时切换布局位置

时间:2017-03-19 06:55:37

标签: opengl fragment-shader vertex-shader fbo

我想使用glDrawArraysInstanced函数来加倍三角形。 两者之间的差异是MVP矩阵。 然后我应用一个带有2个GL_COLOR_ATTACHMENT的FBO,并激活glDrawBuffers(2,...)。

我的顶点着色器:

#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..

似乎每个Instanced都实现了color和color1语句。 那么,是不是'如果'声明无效? 我的问题是fbo和一次传递中输出目标的限制。

1 个答案:

答案 0 :(得分:2)

无法阻止着色器写入已附加的所有输出。你的代码所做的是仅为一个输出分配一个值,但另一个仍在编写。

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

相关问题