1

我正在研究图形管道,我对镶嵌阶段有一些疑问。我的基本阅读材料是《OpenGL SuperBible第六版:综合教程和参考》。

问题 #1:在 SuperBible 中,我读到顶点着色器每个补丁顶点(或曲面细分上下文中的控制点)运行一次,一次“馈送”细分控制着色器一个顶点。反过来,TCS 在顶点组上运行。虽然在这个链接中

http://web.engr.oregonstate.edu/~mjb/cs519/Handouts/tessellation.1pp.pdf

它说 TCS 每个“输出顶点”运行一次(我假设是 VS 输出的顶点)。两者哪一个是真的?我弄错了整个事情还是其中一个错了?

问题 #2:这个是关于 GLSL 的。以下着色器来自 SuperBible 示例。

顶点着色器

#version 410 core
void main(void)
{                                                                                  
    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),                   
                                   vec4(-0.25, -0.25, 0.5, 1.0),                   
                                   vec4( 0.25,  0.25, 0.5, 1.0));                  

    gl_Position = vertices[gl_VertexID];                                           
}

镶嵌控制着色器

#version 410 core                                                                      
layout (vertices = 3) out;                                                         

void main(void)                                                                    
{                                                                                  
    if (gl_InvocationID == 0)                                                     
    {                                                                              
        gl_TessLevelInner[0] = 5.0;                                                
        gl_TessLevelOuter[0] = 5.0;                                                
        gl_TessLevelOuter[1] = 5.0;                                                
        gl_TessLevelOuter[2] = 5.0;                                                
    }                                                                              
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;      
}

a) 标记 gl_VertexID(在顶点着色器上)和 gl_InvocationID(在 TCS 上)是什么意思?它们让我感到困惑,因为它们没有在程序的任何地方明确声明。

b) 我知道在 TCS 中 gl_Position 变量从顶点着色器获取其数据,但在顶点着色器中没有任何地方明确声明 gl_Position 应该是输出(例如,在主程序之前使用 out 关键字)。我认为要通过各种着色器和管道阶段传递数据,必须明确声明具有相同名称的输入和输出,那么在这种情况下发生了什么?

4

1 回答 1

1

这是我能回忆起的,并展示了一些不太精确的定义,对于详细定义,最好访问 opengl.org,查看 GLSL 规范,最新版本应该是 GLSL 4.5。

第一个问题,这两个都是正确的,;) 在几何着色器之前,每个着色器将为输入顶点运行一次,但令人困惑的是顶点着色器将处理“补丁顶点”,TCS 还将处理“补丁顶点”, TES 将处理由 Tessellator 生成的真实顶点[这是一个硬件单元,使您的 GPU 与 DX10/GL3.x 上限设备不同]。VS [顶点着色器,与以下简称相同] 和 TCS 的区别在于 TCS 还会配置 Tessellator 所需的 prope 参数。基本上,VS 和 TCS 处理相同的顶点。

第二个问题#a,gl_VertexID 表示您的输入顶点的 id,gl_InvocationID 表示在您的着色器上运行了多少次,您应该查看 GS 的一些教程或文档,它们有时会使用 gl_InvocationID。实际上,gl_InvocationID == 0 使后续 if-{-} 阶段类似于 D3D 中的“恒定外壳着色器”

第二个问题#b,gl_Position是顶点位置的内置变量,当然你可以用'out'关键字来定义你喜欢的东西,但是OGL SB是一本历史悠久的书~

希望这可以帮助, ;)

于 2014-12-11T16:40:07.217 回答