【问题标题】:gl_VertexID always zero in any useful geometry shadergl_VertexID 在任何有用的几何着色器中总是为零
【发布时间】:2016-10-28 15:30:46
【问题描述】:

我正在使用索引渲染和几何着色器。如果我将 gl_VertexID 传递给几何着色器,只要我不发出任何顶点,它就可以正常工作;如果我发出一个或多个顶点,gl_VertexID(以任何名称传递)为零。为什么?

使用下面的着色器,几何着色器会将正确的索引放入我的反馈缓冲区,当且仅当我注释掉两个 EmitVertex 调用时。我错过了什么?

(我可以解决它,但它让我很烦!)

顶点着色器

#version 440

in vec4 position;

out VSOUT{
  vec4 gl_Position;
  int index;
} vsout;

uniform mat4 gl_ModelViewMatrix;

void main(){
    gl_Position = gl_ModelViewMatrix * position;
    vsout.index = gl_VertexID;
    vsout.gl_Position = gl_Position;
}

几何着色器

#version 440
#extension GL_ARB_shader_storage_buffer_object : enable

layout (lines) in;
layout (line_strip) out;

in VSOUT{
   vec4 gl_Position;
  int index;
} vdata[];

layout (std430, binding=0) buffer FeedbackBuffer{
    vec2 fb[];
};

void main(){
  int i = vdata[0].index;
  int j = vdata[1].index;

  fb[gl_PrimitiveIDIn][0] = vdata[0].index;
  fb[gl_PrimitiveIDIn][1] = vdata[1].index;

  gl_Position = gl_in[0].gl_Position;
  EmitVertex();
  gl_Position = gl_in[1].gl_Position;
  EmitVertex();
}

片段着色器

#version 430

out vec4 outputColor;

void main(){
    outputColor = vec4(.5,.5,.5,.5);
}

【问题讨论】:

    标签: opengl glsl geometry-shader


    【解决方案1】:

    所以这看起来像是一个 nVidia 实现的东西。如果我在 GeForce GTX580 上运行这些着色器,行为如上所述。使用 AMD FirePro V5900,它的行为符合我的预期,无论我是否发出顶点,反馈缓冲区中的值都是正确的。

    【讨论】:

    • 我认为您的问题可能是您的期望不正确?在几何着色器阶段发射一个顶点后,每个顶点的输出变得未定义。如果您没有明确地写出这些值,或者您期待未定义的行为,您将无法期待任何事情。在每次发射后写下每个顶点的输出,然后你可以期待一些东西:)
    • 是的 - 我想过,但索引和反馈缓冲区都不是每个顶点的输出。无论我是否调用 emitVertex,缓冲区都有效(我可以通过向其写入其他值来验证它)。索引是每个顶点的输入,这似乎被emitVertex破坏了。
    • 为变换反馈捕获顶点流是顶点输出。 GS 在 VS 之后运行,而不是相反。除非您为生成的每个顶点编写值,否则您也不能保证几何着色器吐出的所有顶点的一致性。
    • 我了解流程是 VS-GS-FS。反馈缓冲区只是一个调试/演示工具。最初,我使用来自传入线原语的两个 VertexID 来执行查找以确定颜色,然后我在 for 循环中发出该颜色的两个顶点,因此为每个顶点定义了所有参数。你希望这能奏效吗?
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多