【问题标题】:Why does this projection matrix not work?为什么这个投影矩阵不起作用?
【发布时间】:2016-06-24 16:46:37
【问题描述】:

(对不起我的英语水平......)

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

有谁知道发生这种情况的原因吗?

矩阵定义:

// 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 

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

【问题讨论】:

    标签: c opengl matrix glsl


    【解决方案1】:

    您的投影矩阵中有几个错误:

    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);
    

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2014-07-31
      • 1970-01-01
      相关资源
      最近更新 更多