在#version 120顶点着色器中旋转纹理遇黑屏问题求助
解决顶点着色器中旋转纹理的问题(#version 120)
先说说你之前的代码导致黑屏的原因:
- 语法错误:GLSL里矩阵声明应为
mat3 A而非float mat3 A,且全局变量不能在main函数内直接重新赋值,这不符合GLSL的语法规范。 - 逻辑偏差:你错误地对顶点位置做了矩阵变换,但你的需求是调整纹理坐标,顶点被错误变换后会移出视口或扭曲,直接导致黑屏。
- 类型不兼容:
mat3无法直接与vec4相乘,类型不匹配会引发渲染错误。
你的核心需求是修正默认逆时针旋转90度的纹理显示,不需要修改顶点位置,只需要调整传递给片元着色器的纹理坐标即可。针对#version 120,给出两种解决方案:
方案一:直接修正90度旋转(高效版)
如果只是要把逆时针转90度的纹理转回来,直接通过坐标映射实现,不需要三角函数计算:
#version 120 attribute vec4 a_position; attribute vec2 a_texCoord; varying vec2 v_texCoord; void main() { gl_Position = a_position; // 纹理坐标逆时针转90度的逆操作:(x,y) → (y, 1.0 - x) // 适配OpenGL纹理原点在左下角的特性,避免旋转后上下颠倒 v_texCoord = vec2(a_texCoord.y, 1.0 - a_texCoord.x); }
方案二:通用角度旋转(灵活版)
如果需要支持任意角度的纹理旋转,用2D旋转矩阵处理纹理坐标:
#version 120 attribute vec4 a_position; attribute vec2 a_texCoord; varying vec2 v_texCoord; // 旋转角度:顺时针90度对应-π/2(约-1.5708弧度),可按需修改 const float rotation_angle = -1.5708; void main() { gl_Position = a_position; // 构建2D旋转矩阵 mat2 rot_mat = mat2( cos(rotation_angle), -sin(rotation_angle), sin(rotation_angle), cos(rotation_angle) ); // 应用旋转并适配纹理原点 vec2 rotated_coord = rot_mat * a_texCoord; v_texCoord = vec2(rotated_coord.x, 1.0 - rotated_coord.y); }
注意事项
- 纹理坐标范围是[0,1],旋转后要确保坐标仍在这个区间内,否则会出现纹理重复或拉伸问题。
- 优先用方案一处理固定90度旋转,性能更优。
内容的提问来源于stack exchange,提问作者Francesco
相关产品推荐
相关产品推荐

