OpenGL Tessellation着色器传递顶点颜色仅第三个顶点生效问题排查
故障原因
你在曲面细分控制着色器(TCS)中错误使用了patch限定符修饰的输出变量,导致所有前序顶点的颜色值被最后一个顶点覆盖。patch限定符修饰的变量是整个面片(patch)全局共享的属性,不属于单个顶点。你的TCS对每个顶点调用一次(对应gl_InvocationID从0到2),每次都会重写patch_color的值,最终只会保留最后一次调用(第三个顶点,gl_InvocationID=2)的绿色值,所以整个细分后的三角形都显示绿色。
修复方案
把颜色改为逐顶点传递,在TCS中输出顶点级的颜色数组,TES中接收后用曲面细分坐标gl_TessCoord做插值即可,修改后的着色器代码如下:
修改后的曲面细分控制着色器
#version 430 core layout (vertices = 3) out; in vec4 vs_color []; out vec4 tcs_color []; // 去掉patch限定符,声明为逐顶点输出数组 void main() { gl_TessLevelOuter[0] = 10.0; gl_TessLevelOuter[1] = 10.0; gl_TessLevelOuter[2] = 10.0; gl_TessLevelInner[0] = 5.0; gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; tcs_color[gl_InvocationID] = vs_color[gl_InvocationID]; // 每个顶点输出自己的颜色 }
修改后的曲面细分评估着色器
#version 430 core layout (triangles, equal_spacing, cw) in; in vec4 tcs_color []; // 对应TCS的逐顶点输出数组 out vec4 tes_color; void main(void) { gl_Position= ( gl_TessCoord.x * gl_in[0].gl_Position + gl_TessCoord.y * gl_in[1].gl_Position + gl_TessCoord.z * gl_in[2].gl_Position ); // 用曲面细分坐标对三个顶点的颜色做插值 tes_color = gl_TessCoord.x * tcs_color[0] + gl_TessCoord.y * tcs_color[1] + gl_TessCoord.z * tcs_color[2]; }
其他着色器不需要修改,运行即可得到和非曲面细分版本一致的渐变彩虹三角形效果。
内容的提问来源于stack exchange,提问作者armagedescu
相关产品推荐
相关产品推荐

