在片段着色器中输出数据时切换布局位置

Posted

技术标签:

【中文标题】在片段着色器中输出数据时切换布局位置【英文标题】:Switching layout location when outputing data in fragmentShader 【发布时间】:2017-03-19 06:55:36 【问题描述】:

我想用 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 语句。 那么,'if'语句是否无效? 我的问题是如何限制 fbo 中的输出目标和一次通过。

【问题讨论】:

【参考方案1】:

无法阻止着色器写入其附加的所有输出。您的代码所做的只是为一个输出分配一个值,但另一个输出仍被写入。

如果您只想在其中一个附件中获得可见输出,例如,您可以将全透明颜色写入输出并启用 Alpha 混合。

【讨论】:

请注意,如果 ID 是统一的而不是输入的,您可以使用写入掩码来关闭对这些特定缓冲区的写入。 一个新问题....正如你所说,如果着色器将写入所有输出,则左侧和右侧将不是相同颜色的三角形,而是'橙色''红色' 和 'red' 'orange'。那么,'if' 语句是否无效?

以上是关于在片段着色器中输出数据时切换布局位置的主要内容,如果未能解决你的问题,请参考以下文章

片段着色器中未使用纹理数据 - OpenGL

GLSL:使用片段着色器进行对象翻译

在顶点和片段着色器中访问同名统一失败

片段着色器中的球面映射

从片段着色器中的地形高程数据计算法线

在片段着色器中,为啥我不能使用平面输入整数来索引 sampler2D 的统一数组?