我试图在着色器中实现剪辑平面(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,还是需要在片段着色器中进行测试和丢弃?
答案 0 :(得分:1)
首先,那不是结构。这是一个interface block。
其次,您是否需要实例名称取决于您重新声明的gl_PerVertex
。您必须为该着色器阶段使用特定输入/输出接口块的正确实例名称。这是一个列表:
gl_in
,排列。gl_out
,排列。gl_in
,排列。gl_in
,排列。片段着色器需要做什么?是否会自动丢弃fragements,还是需要在片段着色器中进行测试和丢弃?
OpenGL中的所有gl_
变量最终都与某些固定功能设备相关联。执行最后一个顶点处理着色器阶段时,输出gl_*
变量由实现的特定部分使用。片段着色器中的所有gl_*
输入变量最终都是由某个进程生成的。
gl_ClipDistance
也不例外。存在直接绑定到distance-based clipping,这是一个固定功能的过程。它发生在FS执行之前。您必须启用要与glEnable(GL_CLIP_DISTANCE0 + i);
一起使用的剪辑距离。