GLM查看屏幕外的对象

时间:2015-08-20 16:36:01

标签: opengl glsl

我有一个顶点为1和-1(1 1 1,1 1 -1等)的立方体。

目前我只使用视图矩阵并将投影设置为标识:

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
mat4 view = glm::lookAt(vec3(0,0,3),
                        vec3(0,0,0),
                        vec3(0,0,1));
mat4 mvp = view;
GLuint location = glGetUniformLocation(p_myGLSL->getProgramID(), "mvp");
glUniformMatrix4fv(location, 1, GL_FALSE, &mvp[0][0]);

glBindVertexArray(vaoHandle);
glDrawArrays(GL_TRIANGLES, 0, countV);

glFlush();
glutSwapBuffers();

顶点着色代码:

layout (location = 0) in vec3 VertexPosition;   
uniform mat4 mvp;
void main()
{
    gl_Position = mvp * vec4(VertexPosition,1.0);
}

VBO,VAO代码:

// fill values into VBO
GLuint positionBufferHandle;
glGenBuffers(1, &positionBufferHandle);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glBufferData(GL_ARRAY_BUFFER, countV*sizeof(float), positionData, GL_STATIC_DRAW);

// Vertex array object
glGenVertexArrays(1, &vaoHandle);
glBindVertexArray(vaoHandle);

// Read into vertex shader
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, positionBufferHandle);
glVertexAttribPointer(0,3,GL_FLOAT, GL_FALSE, 0, (GLubyte *) NULL);

glutMainLoop();

为什么现在显示空白屏幕?

P / S:如果我手动创建视图矩阵,它可以工作:

mat4 translate = glm::translate(glm::mat4(1), vec3(-centerx, -centery, -centerz));
mat4 scale = glm::scale(glm::mat4(1), vec3(0.2, 0.2, 0.2));
mat4 mvp = scale * translate;

1 个答案:

答案 0 :(得分:1)

使用vec3(0,1,0)作为向上矢量。当您从(0,0,3)中查看(0,0,0)时,您会查找(0,0,-1)方向。向上矢量应垂直于此向量,您可以使用vec3(0,1,0)向量。因此,将view矩阵赋值部分更改为:

mat4 view = glm::lookAt(vec3(0,0,3),
                        vec3(0,0,0),
                        vec3(0,1,0));

此外,添加#version 430或您用于开始顶点着色器的任何GLSL版本。 layout qualifer是OpenGL核心的一部分,因为OpenGL 4.1不是更早。