(抱歉我的英语技能......)
我尝试用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
如果您需要更多代码,请询问。
答案 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);