gpt4 book ai didi

opengl - 为什么这个正交顶点着色器不能产生正确的答案?

转载 作者:行者123 更新时间:2023-12-02 00:04:43 24 4
gpt4 key购买 nike

我的问题是,我有一个(工作的)正交顶点和片段着色器对,允许我通过传入的“translateX”和“translateY”制服指定 Sprite 的中心X和Y。我乘以一个projectionMatrix是硬编码的并且效果很好。就正交操作而言,一切正常。我传入该着色器的几何体以 0, 0, 0 为中心点。

我现在想弄清楚平移后中心点(局部坐标空间中的 0, 0, 0)变成了什么。我需要在片段着色器中知道这些信息。我假设我可以在 0, 0, 0 处创建一个向量,然后应用相同的平移。但是,我没有得到正确的答案。

我的问题:我做错了什么,我该如何调试正在发生的事情?我知道计算的值一定是错误的,但我不知道它是什么。 (我的平台是 OS X 上的 Xcode 4.2,为 OpenGL ES 2.0 iOS 开发)

这是我的顶点着色器:

// Vertex Shader for pixel-accurate rendering
attribute vec4 a_position;
attribute vec2 a_texCoord;

varying vec2 v_texCoord;

uniform float translateX;
uniform float translateY;

// Set up orthographic projection
// this is for 640 x 960
mat4 projectionMatrix = mat4( 2.0/960.0, 0.0, 0.0, -1.0,
0.0, 2.0/640.0, 0.0, -1.0,
0.0, 0.0, -1.0, 0.0,
0.0, 0.0, 0.0, 1.0);

void main()
{
// Set position
gl_Position = a_position;

// Translate by the uniforms for offsetting
gl_Position.x += translateX;
gl_Position.y += translateY;

// Translate
gl_Position *= projectionMatrix;


// Do all the same translations to a vector with origin at 0,0,0
vec4 toPass = vec4(0, 0, 0, 1); // initialize. doesn't matter if w is 1 or 0
toPass.x += translateX;
toPass.y += translateY;
toPass *= projectionMatrix;

// this SHOULD pass the computed value to my fragment shader.
// unfortunately, whatever value is sent, isn't right.
//v_translatedOrigin = toPass;

// instead, I use this as a workaround, since I do know the correct values for my
// situation. of course this is hardcoded and is terrible.
v_translatedOrigin = vec4(500.0, 200.0, 0.0, 0.0);
}

编辑:为了回应我的正交矩阵错误,以下是wikipedia不得不说一下正交投影,我的 -1 看起来是正确的。因为在我的例子中,我的垫子的第四个元素应该是 -((right+left)/(right-left)) ,它是 960 左边的 0 的右边,所以 -1 * (960/960) 是 -1 .

编辑:我可能在这里发现了根本问题 - what do you think?

enter image description here

最佳答案

为什么你的正交矩阵每列底部都有 -1?这些应该是零。当然,这不会影响任何事情。

我更关心的是:

gl_Position *= projectionMatrix;

这是什么意思?矩阵乘法不是可交换的; M * aa * M 不同。那么您希望 gl_Position 在哪一边相乘?

奇怪的是,GLSL 规范没有说明(我对此提交了错误报告)。所以你应该选择保证有效的方法:

gl_Position = projectionMatrix * gl_Position;

此外,您应该使用正确的矢量化代码。您应该拥有一套 translate 制服,即 vec2。然后你就可以执行gl_Position.xy = a_position.xy + translate;。您必须用常量填充 Z 和 W (gl_Position.zw = vec2(0, 1);)。

<小时/>

GLSL 中的矩阵是列主。前四个值是矩阵的第一列,而不是第一行。您正在与转置的正交矩阵相乘。

关于opengl - 为什么这个正交顶点着色器不能产生正确的答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6975089/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com