Python 需要帮助将GLSL 120 gl#U ModelViewProjectionMatrix代码更新为GLSL 330,uniformMatrix isn';着色器中的t更新
我一直在浏览教程,试图了解OpenGL3.3和GLSL3.3。通过遵循使用GLSL 1.2的旧教程,我成功地使该程序与移动相机一起工作。我的顶点着色器是:Python 需要帮助将GLSL 120 gl#U ModelViewProjectionMatrix代码更新为GLSL 330,uniformMatrix isn';着色器中的t更新,python,opengl,matrix,Python,Opengl,Matrix,我一直在浏览教程,试图了解OpenGL3.3和GLSL3.3。通过遵循使用GLSL 1.2的旧教程,我成功地使该程序与移动相机一起工作。我的顶点着色器是: uniform float xpos; uniform float ypos; in vec3 position; void main() { gl_Position = gl_ModelViewProjectionMatrix * (vec4(position,1.0) + vec4( xpos, ypos, 0
uniform float xpos;
uniform float ypos;
in vec3 position;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * (vec4(position,1.0) + vec4(
xpos, ypos, 0.0, 0.0
));
}
#version 330
uniform float xpos;
uniform float ypos;
uniform mat4 u_ModelViewProjectionMatrix;
in vec3 position;
void main() {
gl_Position = u_ModelViewProjectionMatrix * (vec4(position,1.0) + vec4(
xpos, ypos, 0.0, 0.0
));
}
我的代码有一个主循环,它接受用户输入并更改camera类中的矩阵。然后使用线glLoadMatrixd(camera_matrix)将矩阵上载到着色器。这段代码工作得很好,可以显示我的对象,并让我在它们周围移动相机
但是,我正在尝试将代码更新为GLSL 3.3,但不知道如何更新。我知道gl_ModelViewProjectionMatrix已经贬值,这是我在更新时遇到的主要问题。我的新着色器是:
uniform float xpos;
uniform float ypos;
in vec3 position;
void main() {
gl_Position = gl_ModelViewProjectionMatrix * (vec4(position,1.0) + vec4(
xpos, ypos, 0.0, 0.0
));
}
#version 330
uniform float xpos;
uniform float ypos;
uniform mat4 u_ModelViewProjectionMatrix;
in vec3 position;
void main() {
gl_Position = u_ModelViewProjectionMatrix * (vec4(position,1.0) + vec4(
xpos, ypos, 0.0, 0.0
));
}
我使用的代码有:
MatrixLocation = glGetUniformLocation(shaderProgram, 'u_ModelViewProjectionMatrix');
在我的XPO和YPO下添加了获取统一位置调用。以及:
glUniformMatrix4fv(MatrixLocation, 1, GL_FALSE, camera_matrix)
在同一个位置,我的glLoadMatrixd(camera_matrix)调用是
据我所知,在使用glLoadMatrixd将相机矩阵加载到当前矩阵之前,gl_ModelViewProjectionMatrix将该矩阵加载到着色器中。因此,我用一个调用替换了glLoadMatrix,用我的相机矩阵设置统一变量u_ModelViewProjectionMatrix。然后我在着色器中使用了该统一值
但是,当程序使用1.2着色器时,如果将其制作成3.3着色器,程序将停止渲染我的对象,并且不会抛出错误。这只是空白的背景,没有显示我的顶点。当打印“我的摄影机矩阵”时,它显示每个版本的更新方式相同,因此将摄影机矩阵转换为着色器时一定会出错。有人知道我做错了什么吗
编辑:打开窗口时,我运行:
glViewport(0, 0, width, height)
glClear(GL_COLOR_BUFFER_BIT)
glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluPerspective(60.0, float(width)/height, .1, 1000.)
glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
然后运行设置窗口、创建着色器、创建对象vao/顶点缓冲区和主循环的代码。我的循环检查输入,更新我的相机类的相机矩阵,然后使用glUseProgram(shaderProgram)/更新制服/glVindVertexArray(obj.vao)/GlDrawArray进行渲染。当前存在两个问题
camera_matrix
是您的模型视图矩阵,但您试图将其用作投影*模型视图camera\u matrix
是一个由16个GLdouble
变量组成的数组(最初使用glLoadMatrixd(…)
可以证明这一点)
需要一个包含16个glUniformMatrix4fv(…)
变量的数组GLfloat
gluPerspective(60.0,float(width)/height,.11000.)
)或传递两个矩阵制服-一个用于ModelView矩阵,另一个用于投影矩阵。后者更为明智
要解决问题,请在将矩阵发送到GLSL之前将双精度转换为单精度。甚至不必费心向GLSL传递一个双精度4x4矩阵(
dmat4
),即使它实际受支持(GL 4.0+或通过GL\U ARB\U gpu着色器\U fp64
扩展),也不值得费心。我的问题源于我试图更新着色器,同时仍然使用折旧矩阵堆栈。我将程序更新到较新版本的命令已关闭
我所做的就是去掉matrixload/matrixmode函数,去掉了相机矩阵,去掉了透视图
我用以下方法将3个新矩阵绑定到我的程序:
modelLoc = glGetUniformLocation(shader, 'model');
viewLoc = glGetUniformLocation(shader, 'view');
projLoc = glGetUniformLocation(shader, 'proj');
然后我创建了一个新类来处理矩阵,创建了3个新的标识矩阵,并将它们更新到我的着色器中:
model = Matrix();
view = Matrix();
proj = Matrix();
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, view.toArray())
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, model.toArray())
glUniformMatrix4fv(projLoc, 1, GL_FALSE, proj.toArray())
我让着色器处理所有的单位矩阵。然后,我在我的矩阵上编写自定义函数以进行翻译/etc,并编辑矩阵以对其进行处理,以查看哪些功能有效:
view.traslate(x,y,z)
proj.perspectiveProjection(fovRadians, aspectRatio, nearClip, farClip)
我仍然在玩我的相机,试图理解从世界单位到屏幕单位的转换,以实现更好的功能,如观察、旋转等。我“重新发明了轮子”,以了解sceens背后到底发生了什么,但我觉得我现在已经掌握了它。谢谢大家的帮助。在将矩阵推送到着色器之前,您是否使用正确的程序调用了GluseProgramm?最常见的错误是在链接程序之前调用
glGetUniformLocation()
,或者按照@BDL的建议,在GluseProgramm()之前调用GluseForm*()
。是的,在使用glUniform1f为xpos/ypos设置所有制服以及glUniformMatrix4fv为相机矩阵设置所有制服之前,我将glUseProgram与我的着色器程序一起使用。谢谢您的帮助。从这个答案开始,我开始研究glLoadMatrix,并意识到它的用途是将矩阵上传到当前矩阵堆栈。因为它们与gl_ModelViewProjectionMatrix一起折旧,所以glLoadMatrix没有将值发送到正在读取的任何位置。我完全摆脱了它。我正试图将GLSL更新到下一个版本,而我的程序代码与着色器的连接也被降级了。@Pricedg:顺便说一句,它被弃用了。折旧意味着价值降低,但deprecate意味着不赞成某些东西(或者用软件术语来说,认为不赞成的东西过时/不受支持)。这是一个常见的错误;)