如何访问特定顶点的gl_Position并在曲面细分着色器中修改
直接给结论
没有vertex1.gl_Position这种写法,OpenGL的GLSL语法根本不支持这种按自定义顶点名访问变量的逻辑。每个顶点确实持有独立的gl_Position值,在曲面细分阶段要操作特定顶点的位置,必须通过GLSL提供的内置输入输出数组访问。
基础规则
- 顶点着色器(VS)里的
gl_Position是逐顶点输出:VS每次运行只处理一个顶点,写入的gl_Position只对应当前正在处理的顶点,每个顶点跑完VS都会存一份自己的gl_Position,不存在所有顶点共用一个变量的情况。 - 曲面细分阶段的访问逻辑:曲面细分控制着色器(TCS)是按patch(补丁图元)为单位处理数据的,一次调用就能拿到当前patch里的所有顶点数据。VS传过来的所有逐顶点内置输出(包括
gl_Position)都存在内置只读数组gl_in里,数组长度和你设置的patch顶点数一致,索引从0开始对应patch里的第N个顶点。比如要拿patch里第1个顶点的位置,写法是gl_in[1].gl_Position。
修改位置的具体写法
gl_in是只读的,直接改gl_in[i].gl_Position会编译报错,要改特定顶点的位置得写入对应的输出数组:
- 在TCS阶段改:直接给内置输出数组
gl_out对应索引的成员赋值就行,比如要把第2个顶点的位置改成自定义值,代码示例:
// 把patch中索引为2的顶点位置修改为(0.0, 1.0, 0.0) gl_out[2].gl_Position = vec4(0.0, 1.0, 0.0, 1.0);
修改后的值会自动传给后续的细分求值着色器(TES)。
2. 在TES阶段改:TES里同样通过gl_in[i].gl_Position读取TCS输出的顶点位置,因为TES是逐细分生成的顶点执行的,你算完最终位置后直接给当前阶段的gl_Position赋值就行,这个值就是输出到后续几何着色器、裁剪阶段的最终顶点位置。
注意:TES阶段最终输出的
gl_Position必须是裁剪空间坐标,不然渲染结果会完全错乱。
内容的提问来源于stack exchange,提问作者openglnoob
相关产品推荐
相关产品推荐

