为什么这个投影矩阵不起作用?

时间:2016-06-24 16:46:38

标签: c opengl matrix glsl

(抱歉我的英语技能......)

我尝试用glsl #version 440编写自己的着色器,所以我也使用自己的投影矩阵,但我只得到这个:output 而不是 (第二个没有投影矩阵)

有谁知道发生了什么事的原因?

矩阵定义:

// projectionMatrix is global defined
void Perspective(float fovy, float aspect, float near, float far)
{
  fovy = degree*90;
  float f;
  f = 1/tan(fovy/2);

  projectionMatrix[0] = f/aspect;   projectionMatrix[4] = 0;    projectionMatrix[8] = 0;            projectionMatrix[12] = 0;
  projectionMatrix[1] = 0;      projectionMatrix[5] = f;    projectionMatrix[9] = 0;            projectionMatrix[13] = 0;
  projectionMatrix[2] = 0;      projectionMatrix[6] = 0;    projectionMatrix[10] = (far+near)/(near-far);   projectionMatrix[14] = (2*far*near)/near-far;
  projectionMatrix[3] = 0;      projectionMatrix[7] = 0;    projectionMatrix[11] = -1;          projectionMatrix[15] = 1;

  gl

UniformMatrix4fv(posProjectionMatrix, 1, GL_TRUE, projectionMatrix);
}

顶点着色器:

#version 440

in vec4 vertexPosition;
in vec4 vertexColor;

out vec4 Color;

uniform mat4 modelMatrix;
uniform mat4 projectionMatrix;
uniform mat4 viewMatrix;

void main() 
{
  gl_Position = projectionMatrix*vec4(vertexPosition.xyz, 1);
  Color = vertexColor;
}

//END 

如果您需要更多代码,请询问。

1 个答案:

答案 0 :(得分:2)

投影矩阵中存在一些错误:

projectionMatrix[14] = (2*far*near)/near-far;

表达式中缺少括号,它应该是:

projectionMatrix[14] = (2*far*near)/(near-far);

最后一个元素也是错误的:

projectionMatrix[15] = 1;

此矩阵元素必须为0:

projectionMatrix[15] = 0.0f;

另外,正如@Nicol Bolas在现在删除的答案中已经指出的那样,你是按照列主要顺序构建矩阵,所以你不应该使用glUniformMatrix4fv()的参数来转换矩阵作为上传。正确的电话是:

glUniformMatrix4fv(posProjectionMatrix, 1, GL_FALSE, projectionMatrix);