Iphone OpenGL ES 2.0:矩阵乘法问题

Iphone OpenGL ES 2.0:矩阵乘法问题,iphone,matrix,opengl-es-2.0,Iphone,Matrix,Opengl Es 2.0,我正在尝试使用OpenGL ES 2.0绘制一个四边形。 我的顶点着色器如下所示: uniform mat4 mvp; attribute vec4 position; attribute vec4 color; varying vec4 colorVarying; void main() { gl_Position = mvp * position; colorVarying = color; } 如果我使用这些顶点: -1.0f, -1.0f, 0.f, 1.f, 1.

我正在尝试使用OpenGL ES 2.0绘制一个四边形。 我的顶点着色器如下所示:

uniform mat4 mvp;
attribute vec4 position;
attribute vec4 color;
varying vec4 colorVarying;

void main()
{
    gl_Position = mvp * position;
    colorVarying = color;
}
如果我使用这些顶点:

-1.0f, -1.0f, 0.f, 1.f,
 1.0f, -1.0f, 0.f, 1.f,
-1.0f,  1.0f, 0.f, 1.f,
 1.0f,  1.0f, 0.f, 1.f
以及该矩阵(按列主顺序,以及以下所有矩阵):

四边形覆盖视口的右半部分。事实上,如果我将这两个矩阵相乘,我就得到了顶点

0,    -1,     0,     1,
1,    -1,     0,     1,
0,     1,     0,     1,
1 ,    1,     0,     1,
如果我使用这些顶点和一个单位矩阵,我会得到相同的结果。看来乘法是正确的

现在,如果我乘以这些顶点(A):

通过该矩阵(M):

我得到这些顶点(B):

如果我通过着色器B顶点和身份矩阵,它在视口中间渲染一个小矩形。但是如果我把A顶点和M矩阵传递给它,它什么也不渲染


发生了什么事?

您正在使用的数学库可能与GLSL使用的矩阵顺序不同。在将矩阵M传递给着色器之前,请尝试转置矩阵M。

问题在于,顶点着色器完成后的gl_位置将经过剪裁,与范围[-W]进行比较,如果gl_位置超出该范围,则进行剪裁(未绘制)

如果乘以A*M并将结果设置为gl_位置,则给定使用W坐标的矩阵将为-301,一个负数,这将反转剪裁比较

在进行乘法之前,尝试将矩阵M乘以-1,这将产生与将矩阵B乘以单位矩阵相同的结果

从“”开始:

避免使用负w顶点坐标和负q纹理坐标。OpenGL可能无法正确剪裁此类坐标,并且在着色由此类坐标定义的基本体时可能会产生插值错误


问题是wz单元中的-1,三角形的法线方向相反,因为它们是单面的,所以没有绘制。我通过将M改为以下方式解决了问题:

0.4170         0         0         0
     0    0.5560         0         0
     0         0    1.2220    1.0000
     0         0 -444.4440         0

我还更改了z列的符号(实际上是行,因为矩阵是转置的),以便在z轴上保持-1尽可能接近+1。

我没有使用任何数学库。我将矩阵和顶点按列顺序排列。此外,如果这是问题所在,第一次尝试使用半视口矩形也不会奏效。尽管如此,我还是尝试了转置M,但它仍然没有显示任何内容。嗯。。。现在我不知道该接受哪个答案。结果证明,解决方案只是将右下象限乘以-1,而不是整个矩阵。然而,你说负w是问题所在,这可能是对的。我以为三角形是单面的,但当我试图画一个三角形时,无论我以什么顺序列出顶点,它都会被画出来,所以这似乎不是问题。
-100.0f, -100.0f, 301.0f, 1.0f,
 100.0f, -100.0f, 301.0f, 1.0f,
-100.0f,  100.0f, 301.0f, 1.0f,
 100.0f,  100.0f, 301.0f, 1.0f,
0.4170         0         0         0
     0    0.5560         0         0
     0         0   -1.2220   -1.0000
     0         0  444.4440         0
 0.2075,    0.2766,   -0.9892,    1.0000
-0.2075,    0.2766,   -0.9892,    1.0000,
 0.2075,   -0.2766,   -0.9892,    1.0000,
-0.2075,   -0.2766,   -0.9892,    1.0000,
0.4170         0         0         0
     0    0.5560         0         0
     0         0    1.2220    1.0000
     0         0 -444.4440         0