我试图获得一个有效的OpenGL渲染器,但是我陷入了一个奇怪的地方。我正在生成看似正确的模型,视图和投影矩阵。 GLIntercept给出了以下日志:
glClear(GL_COLOR_BUFFER_BIT)
glEnableVertexAttribArray(0)
glUniformMatrix4fv(0,1,false,[... see below ...])
glBindBuffer(GL_ARRAY_BUFFER,1)
glVertexAttribPointer(0,3,GL_FLOAT,false,0,0000000000000000)
glDrawArrays(GL_POLYGON,0,3) GLSL=3
glDisableVertexAttribArray(0)
wglSwapBuffers(FFFFFFFF9D011AB3)=true
我的MVP矩阵如下:
[
0,050000 0,000000 0,000000 0,500000
0,000000 0,050000 0,000000 0,500000
0,000000 0,000000 5,000000 0,000000
0,000000 0,000000 -50,000000 1,000000
]
以下是我使用的顶点着色器:
#version 330
layout (location = 0) in vec3 vertex;
uniform mat4 mvp;
out vec4 color;
void main() {
gl_Position = mvp * vec4(vertex, 0.0);
color = vec4(1, 1, 1, 1);
}
和片段着色器:
#version 330
in vec4 color;
out vec4 fragColor;
void main() {
fragColor = color;
}
This是我如何计算投影矩阵,坐标是最简单的 可能,扁平的立方体:
[
new Vector3f(-1, -1, 0),
new Vector3f(1, -1, 0),
new Vector3f(1, 1, 0),
new Vector3f(-1, 1, 0)
]
然而,这导致了一个奇怪的事情:
如果我将矩阵与app中相同的坐标相乘,我会得到预期的结果:
(0,45 0,45 0,00 1,00)
(0,55 0,45 0,00 1,00)
(0,55 0,55 0,00 1,00)
(0,45 0,55 0,00 1,00)
有人能指出我的方向来解决这个问题吗?
答案 0 :(得分:1)
主要问题出在你的顶点着色器中:
gl_Position = mvp * vec4(vertex, 0.0);
将常规3D坐标扩展为齐次坐标时,需要将w
组件设置为1.0。所以声明应该是这样的:
gl_Position = mvp * vec4(vertex, 1.0);
你有4个顶点但是将3作为绘制调用的顶点数(最后一个参数)传递给它有点奇怪:
glDrawArrays(GL_POLYGON, 0, 3);