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

在#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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 01:45:26