Python 需要帮助将GLSL 120 gl#U ModelViewProjectionMatrix代码更新为GLSL 330,uniformMatrix isn';着色器中的t更新

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

我一直在浏览教程,试图了解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.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(…)
    可以证明这一点)

    • glUniformMatrix4fv(…)
      需要一个包含16个
      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意味着不赞成某些东西(或者用软件术语来说,认为不赞成的东西过时/不受支持)。这是一个常见的错误;)