c – 在OpenGL中设置MVP矩阵
发布时间:2020-12-16 07:07:40 所属栏目:百科 来源:网络整理
导读:我正在尝试学习OpenGL的基础知识,但我在设置转换矩阵时遇到了问题.我制作了模型,视图和投影矩阵,但是我将它们发送到顶点着色器时遇到了问题. 这是代码: //Set up MVPglm::mat4 model = glm::mat4();GLint uniModel = glGetUniformLocation(program,"model")
我正在尝试学习OpenGL的基础知识,但我在设置转换矩阵时遇到了问题.我制作了模型,视图和投影矩阵,但是我将它们发送到顶点着色器时遇到了问题.
这是代码: //Set up MVP glm::mat4 model = glm::mat4(); GLint uniModel = glGetUniformLocation(program,"model"); glUniformMatrix4fv(uniModel,1,GL_FALSE,glm::value_ptr(model)); glm::mat4 view = glm::lookAt( glm::vec3(2.5f,2.5f,2.0f),glm::vec3(0.0f,0.0f,0.0f),1.0f)); GLint uniView = glGetUniformLocation(program,"view"); glUniformMatrix4fv(uniView,glm::value_ptr(view)); glm::mat4 proj = glm::perspective(45.0f,800.0f / 600.0f,1.0f,10.0f); GLint uniProj = glGetUniformLocation(program,"proj"); glUniformMatrix4fv(uniProj,glm::value_ptr(proj)); 和着色器: layout (location = 0) in vec3 position; uniform mat4 model; uniform mat4 view; uniform mat4 proj; void main() { gl_Position = proj * view * model * vec4(position,1.0); } 我觉得我在设置制服方面做错了,因为它没有画任何东西,即使我设置模型,查看和proj到身份.可能我只是错误的东西,但我真的找不到问题. 编辑:解决了,问题是我忘了首先使用glUseProgram(). 解决方法
首先要检查所有可能的返回代码,验证您的着色器程序是否已正确编译和链接,并确保您的制服有效,这意味着位置值>> 0.
当你不知道哪里出错时,使用glGetError()的二进制搜索在这些实例中也非常有用. 编译着色器后,请务必检查glGetProgram(GL_LINK_STATUS,…).最后,您必须调用glUseProgram()来激活着色器. 正如@Vallentin所说,传递预先计算的MVP矩阵要高效得多,因为它不会在应用程序和着色器之间发生变化.这有点简化了您的代码,对于您的应用程序代码来说就是这样: // Set up MVP matrices glm::mat4 model = glm::mat4(); glm::mat4 view = glm::lookAt( glm::vec3(2.5f,1.0f)); glm::mat4 proj = glm::perspective(45.0f,10.0f); glm::mat4 mvp = proj * view * model; glUseProgram(prog); GLint uniMvp = glGetUniformLocation(program,"mvp"); glUniformMatrix4fv(uniMvp,glm::value_ptr(mvp)); 然后是GLSL: // Shader code layout (location = 0) in vec3 position; uniform mat4 mvp; void main() { gl_Position = mvp * vec4(position,1.0); } 此外,您可以缓存统一位置,因为它们在编译后不会更改.这将为每帧节省少量,而不是每次重绘时查询它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |