通过着色器阶段传递gl_ClipDistance。如何以及在何处重新定义gl_PerVertex?

时间:2018-01-03 14:07:48

标签: opengl glsl

我试图在着色器中实现剪辑平面(OpenGL 3.3)。我在顶点着色器中评估剪裁平面,然后将数据传递给几何着色器。文档声明我需要用我正在使用的正确数量的剪辑距离重新定义struct gl_PerVertex,但我不知道在哪里以及如何丢失,以及如何丢弃片段实际发生...

顶点着色器有意义:

out gl_PerVertex {
    vec4 gl_Position;
    float gl_ClipDistance[6];
} <NAME_NEEDED?>;

但是:我需要命名结构吗?如果没有会发生什么?名称必须是默认值&#34; gl_out&#34;?

在几何着色器中:

in gl_PerVertex {
    vec4 gl_Position;
    float gl_ClipDistance[6];
} <NAME_NEEDED?>;

out gl_PerVertex {
    vec4 gl_Position;
    float gl_ClipDistance[6];
} <NAME_NEEDED?>;

再次:我需要命名结构吗?如果没有会发生什么?该名称必须是默认名称&#34; gl_in []&#34;和&#34; gl_out&#34;?

最后:片段着色器需要做什么?是否会自动丢弃fragements,还是需要在片段着色器中进行测试和丢弃?

1 个答案:

答案 0 :(得分:1)

首先,那不是结构。这是一个interface block

其次,您是否需要实例名称取决于您重新声明的gl_PerVertex。您必须为该着色器阶段使用特定输入/输出接口块的正确实例名称。这是一个列表:

  • 顶点着色器输出:
    • 没有实例名称。
  • 曲面细分控制着色器输入
    • gl_in,排列。
  • TCS输出
    • gl_out,排列。
  • 曲面细分评估着色器输入
    • gl_in,排列。
  • TES输出
    • 没有实例名称。
  • 几何着色器输入
    • gl_in,排列。
  • 几何着色器输出:
    • 没有实例名称。
  

片段着色器需要做什么?是否会自动丢弃fragements,还是需要在片段着色器中进行测试和丢弃?

OpenGL中的所有gl_变量最终都与某些固定功能设备相关联。执行最后一个顶点处理着色器阶段时,输出gl_*变量由实现的特定部分使用。片段着色器中的所有gl_*输入变量最终都是由某个进程生成的。

gl_ClipDistance也不例外。存在直接绑定到distance-based clipping,这是一个固定功能的过程。它发生在FS执行之前。您必须启用要与glEnable(GL_CLIP_DISTANCE0 + i);一起使用的剪辑距离。