GLSL 1.20中ftransform()与指定矩阵运算表达式功能是否等价?
Minecraft着色器中ftransform()与自定义矩阵计算的功能对比
在学习Minecraft着色器时接触到ftransform()函数,顶点着色器(.vsh)中的使用示例如下:
gl_Position = ftransform(); TexCoords = gl_MultiTexCoord0.st;
GLSL 1.20的官方文档未提供该函数的实现细节,这里明确回答:上述代码与下面这段代码功能完全不一致。
对比代码:
gl_Position = mat3(gbufferModelViewInverse) * (gl_NormalMatrix * gl_Normal); TexCoords = gl_MultiTexCoord0.st;
核心差异说明
ftransform()的本质是完成标准顶点变换流水线:将模型空间的顶点gl_Vertex,依次通过gl_ModelViewMatrix(模型转视图空间)和gl_ProjectionMatrix(视图转裁剪空间)变换,最终得到裁剪空间位置赋值给gl_Position,这是顶点着色器中确定顶点屏幕位置的标准操作。- 第二段代码的逻辑是法线空间转换:先用
gl_NormalMatrix(gl_ModelViewMatrix的逆转置)把模型空间法线gl_Normal转到视图空间,再通过gbufferModelViewInverse的3x3矩阵部分转回到模型空间,最终得到的是模型空间的法线向量,完全不是顶点的裁剪空间位置。把这个结果赋值给gl_Position会导致顶点位置完全错误,渲染出的画面必然异常。
内容的提问来源于stack exchange,提问作者Colluk
相关产品推荐
相关产品推荐

