所以我试图在OpenGL中转向更现代的,基于着色器的渲染系统,并且据我了解,其中的一部分正在执行过去完成的投影使用旧版OpenGL中的内置矩阵堆栈,而不是将我自己的矩阵提供给着色器。这里是我的着色器(道歉,由于某种原因,我不能让空白出现在代码格式化):基于GLSL的投影/模型视图使对象不可见
//Vertex
attribute vec3 coord3d;
attribute vec3 v_color;
varying vec3 f_color;
uniform mat4 projection;
uniform mat4 model;
uniform mat4 view;
void main(void)
{
gl_Position = projection * view * model * vec4(coord3d, 1.0);
f_color = v_color;
}
//Fragment
varying vec3 f_color;
void main(void)
{
gl_FragColor = vec4(f_color.x, f_color.y, f_color.z, 1.0);
}
我一直有一些问题,但是,在乘以投影和/或视图矩阵使我的测试对象消失。如果我改变着色器这样的:按预期在屏幕上,平坦,并且相对于[-1,1]的屏幕的空间定位出现
gl_Position = model * vec4(coord3d, 1.0);
的对象。我们一步一步来完成。
我有三个相关的类,我们称它们为场景,对象和相机。在场景的构造,这些GLuints设置:
//Model - must be changed for each model
Object::ModelUniform = glGetUniformLocation(ObjectShader, "model");
//View - must be changed once per frame
m_ViewUniform = glGetUniformLocation(ObjectShader, "view");
//Projection - must only be set once
m_ProjectionUniform = glGetUniformLocation(ObjectShader, "projection");
glm::mat4 projection = glm::perspective(60.0f, 1.33f, 0.1f, 512.f);
glUniformMatrix4fv(m_ProjectionUniform, 1, GL_FALSE, glm::value_ptr(projection));
然后,每帧一次(仍然在场景;我有旧着色器在后台运行的其他对象+ glMultMatrixf()的代码,但我不认为有)
glm::vec3 Eye = glm::vec3(CameraPos.x, CameraPos.y, CameraPosz);
glm::vec3 Center = glm::vec3(ObjectPos.x, ObjectPos.y, ObjectPosz);
glm::vec3 Up = glm::vec3(0.0, 1.0, 0.0);
glm::mat4 view = glm::lookAt(Eye, Center, Up);
glUniformMatrix4fv(m_ViewUniform, 1, GL_FALSE, glm::value_ptr(view));
glUseProgram(ObjectShader);
Object->Cycle();
然后,在对象::周期(:任何两者之间的相互作用)
glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(Position.x, Position.y, Position.z));
glUniformMatrix4fv(Object::ModelUniform, 1, GL_FALSE, glm::value_ptr(model));
glEnableVertexAttribArray(CoordinateAttribute);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
glVertexAttribPointer(CoordinateAttribute, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), 0);
glEnableVertexAttribArray(ColorAttribute);
glBindBuffer(GL_ARRAY_BUFFER, m_VertexBuffer);
glVertexAttribPointer(ColorAttribute, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*) (3 * sizeof(GLfloat)));
glDrawArrays(GL_TRIANGLES, 0, 6);
glDisableVertexAttribArray(ColorAttribute);
glDisableVertexAttribArray(CoordinateAttribute);
glDisable(GL_BLEND);
glBindBuffer(GL_ARRAY_BUFFER, 0);
所有矩阵我用做工精细我n旧的OpenGL,使用像glMultMatrixf()这样不推荐使用的函数。
如上所述,只使用模型矩阵工作正常。旋转相机并没有找到丢失的物体。
这里有什么问题?
你应该看看这个: http://stackoverflow.com/questions/4202456/how-do-you-get-the-modelview-and-projection-matrices-in-opengl (它澄清时你可能会也可能不会直接在你的glsl着色器代码中使用内置的gl_ModelViewProjectionMatrix等) – 2013-03-02 14:06:09
嗯,我的目标是OpenGL 3.3+,所以GLSL 3.3+也是如此。我没有使用已弃用的gl_ModelViewProjectionMatrix,但我认为你指的是gl_Position,这也被弃用?我应该改为使用'out vec4'吗?这似乎也不起作用。 – GarrickW 2013-03-02 14:13:47
'glEnableClientState'已弃用。 – 2013-03-04 20:19:23