You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 07:24:06