【问题标题】:Issues with Z-axis rotation matrix in glsl shaderglsl着色器中Z轴旋转矩阵的问题
【发布时间】:2011-06-23 17:19:37
【问题描述】:

我最近开始从头开始构建 OpenGL ES 1.1/2.0 2D 管道(仅限 iPhone)。此管道旨在供没有 3D 数学经验的工程师使用。

注释掉的是 X 轴和 Y 轴旋转矩阵,它们会产生它们应该得到的准确结果。 Z 旋转矩阵似乎什么都不做。

顶点着色器

//THESE WORK
/*
highp mat4 rotationMatrix = mat4(1.0, 0.0, 0.0, 0.0,
                                 0.0, cos(angle), -sin(angle), 0.0,
                                 0.0, sin(angle), cos(angle), 0.0,
                                 0.0, 0.0, 0.0, 1.0); 

highp mat4 rotationMatrix = mat4(cos(angle), 0.0, sin(angle), 0.0,
                                 0.0, 1.0, 0.0, 0.0,
                                 -sin(angle), 0.0, cos(angle), 0.0,
                                 0.0, 0.0, 0.0, 1.0); 
*/

//THIS DOESN'T WORK >:(
highp mat4 rotationMatrix = mat4(cos(angle), -sin(angle), 0.0, 0.0,
                                     sin(angle), cos(angle), 0.0, 0.0,
                                     0.0, 0.0, 1.0, 0.0,
                                     0.0, 0.0, 0.0, 1.0);  

gl_Position = a_position;
gl_Position *= rotationMatrix;

由于这将用于 2D 渲染并交给没有 3D 经验的工程师,我宁愿避免传入 MVP 矩阵,而只推送基本的缩放、旋转和平移变量(并跳过为第 10 次)。

自从我纠结于矩阵数学和着色器以来已经有一段时间了,所以我希望这是一个小错误。

感谢您的帮助!

编辑/更新:

我发现后处理通道正在破坏角度。

我现在发现 Z 旋转似乎可以缩放四边形。我记得这是一个 n00b 问题,我正在研究它......

我忘了说我有一个便宜的临时投影矩阵

//s_scalefactor is for retina vs non-retina display

highp mat4 projectionMatrix = mat4( 2.0/(320.0 * s_scalefactor), 0.0, 0.0, -1.0,
                                    0.0, 2.0/(480.0 * s_scalefactor), 0.0, -1.0,
                                    0.0, 0.0, 1.0, 0.0,
                                    0.0, 0.0, 0.0, 1.0);  

gl_Position *= projectionMatrix;

它很便宜,但我不确定它是否会使 Z 旋转变硬。

编辑#2:

我在尝试使用平截头体而不是正交并在着色器之外计算矩阵时也无处可寻。

【问题讨论】:

  • 那么...解决了吗?现在有什么问题?

标签: iphone matrix glsl shader rotational-matrices


【解决方案1】:

我遇到了同样的问题,非常非常奇怪。我能够通过使用访问器运算符而不是使用构造函数填充 mat4 结构来解决它:

mat4 rotateZ;
rotateZ[0].x    = cosAngle;
rotateZ[0].y    = negSinAngle;
rotateZ[0].z    = 0.0;
rotateZ[0].w    = 0.0;
rotateZ[1].x    = sinAngle;
rotateZ[1].y    = cosAngle;
rotateZ[1].z    = 0.0;
rotateZ[1].w    = 0.0;
rotateZ[2].x    = 0.0;
rotateZ[2].y    = 0.0;
rotateZ[2].z    = 1.0;
rotateZ[2].w    = 0.0;
rotateZ[3].x    = 0.0;
rotateZ[3].y    = 0.0;
rotateZ[3].z    = 0.0;
rotateZ[3].w    = 1.0;

【讨论】:

    猜你喜欢
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多