2013-03-02 64 views
0

所以我试图在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()这样不推荐使用的函数。

如上所述,只使用模型矩阵工作正常。旋转相机并没有找到丢失的物体。

这里有什么问题?

+0

你应该看看这个: 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

+0

嗯,我的目标是OpenGL 3.3+,所以GLSL 3.3+也是如此。我没有使用已弃用的gl_ModelViewProjectionMatrix,但我认为你指的是gl_Position,这也被弃用?我应该改为使用'out vec4'吗?这似乎也不起作用。 – GarrickW 2013-03-02 14:13:47

+0

'glEnableClientState'已弃用。 – 2013-03-04 20:19:23

回答

3

这里:

glUniformMatrix4fv(m_ProjectionUniform, 1, GL_FALSE, glm::value_ptr(projection)); 

这里

glm::mat4 view = glm::lookAt(Eye, Center, Up); 
glUniformMatrix4fv(m_ViewUniform, 1, GL_FALSE, glm::value_ptr(view)); 
glUseProgram(ObjectShader); 
Object->Cycle(); 

您设置的看法,但您激活着色器后,你这样做。也许你有与投影矩阵相同的问题,但我无法从你的代码中知道。着色器需要处于活动状态才能在其上设置制服。您在设置这些时可能只是没有着色器界限。另一方面,从您发布的位开始,着色器可以始终处于活动状态,因此这将在第一帧后生效。这是不可能告诉寿。

+0

这就是它!谢谢!我从来不知道!我以为你可以无拘无束地制服。 – GarrickW 2013-03-06 16:51:16

+1

不客气。不幸的是,你对原始问题进行了很多编辑,这变成了一个社区wiki,我没有得到任何假想的互联网点;-)无论如何,glUniform *调用不会将程序作为参数(而不是glGetUniformLocation调用)作为暗示它需要程序被绑定。是的,这是关于OpenGL的一个非常糟糕的方面。 – ltjax 2013-03-07 10:52:19

1

试试这个:

uniform mat4 ModelView; 
uniform mat4 ProjectionView; 

in vec4 position; 

void main() 
{ 
    gl_Position = ProjectionView * ModelView * position ; 
} 

矩阵乘法从右在OpenGL向左推移。

+0

不幸的是,这似乎没有帮助 - 屏幕上仍然没有任何可见的东西。 – GarrickW 2013-03-02 14:46:05

+0

然后,它肯定不会来自这里,也许你的VBO/Shader初始化或渲染。 – dimmak111 2013-03-02 14:50:41

+0

那么,我确实有一个旧的设置,使用不推荐使用的函数的着色器工作正常 - 我已经添加了上述代码。 – GarrickW 2013-03-02 15:03:24

相关问题