OpenGL Glulookat不与着色器一起使用

OpenGL gluLookat not working with shaders on

本文关键字:一起 Glulookat OpenGL      更新时间:2023-10-16

当我想使用glulookat并在上面放上着色器时,当我关闭着色器时,它不会移动"相机"。

我的着色器中缺少一些东西,我无法弄清楚。

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.8, 0.8, 0.8, 0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(0.5,0,1,0.5,0,0,0,1,0);
    glColor3f(0, 0, 0);
    glDrawArrays(GL_TRIANGLES, 0, 6);
    glDrawArrays(GL_LINES, 6, 6);
    glDrawArrays(GL_TRIANGLES, 12,6);
    glDrawArrays(GL_LINES, 18, 4);
    glDrawArrays(GL_TRIANGLES, 22, 6);
    glColor3f(1, 0.7, 0);
    glDrawArrays(GL_TRIANGLES, 28, 6);
    glFlush();
}

顶点着色器:

#version 450 core  // 420, 330 core , compatibility
in vec4 position
out vec4 Color;
void main()
{ 
 gl_Position = position;
}

碎片着色器:

#version 450 core  // 420, 330 core , compatibility
in vec4 Color;
layout(location=0) out vec4 fColor;
void main() 
{
 fColor = vec4(0,0,0,0); 
}

将"相机"移至我希望使用

上的着色器所在的位置

使用着色器程序时,当前矩阵不会神奇地处理顶点坐标属性。着色器程序必须进行顶点坐标的转换。


拥有2种可能性,您要么使用兼容性配置文件上下文并使用较低的GLSL版本(例如1.10(。

然后,您可以使用内置的均匀gl_ModelViewProjectionMatrix(请参阅GLSL 1.10 Secification(,固定功能矩阵堆栈将起作用:

#version 110
attribute vec4 position
// varying vec4 Color;
void main()
{ 
     // ...  
     gl_Position = gl_ModelViewProjectionMatrix * position;
}

,但请注意,这是自数十年以来一直对此弃用的。请参阅固定功能管道和旧版OpenGL。


我建议使用诸如OpenGL数学之类的库来计算lookAt()和统一变量的视图矩阵:

#version 450 core  // 420, 330 core , compatibility
in vec4 position
// out vec4 Color;
layout(location = 7) uniform mat4 view_matrix;
void main()
{ 
    gl_Position = view_matrix * position;
}
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
// [...]
{
    // [...]
    glUseProgram(program);
    glm::mat4 view = glm::lookAt(
        glm::vec3(0.5f,0.0f,1.0f), glm::Vec3(0.5f,0.0f,0.0f), glm::Vec3(0.0f,1.0f,0.0f));
    glUniformMatrix4fv(7, 1, GL_FALSE, glm::value_ptr(view);
    // [...]
}

统一位置由布局预选赛(location = 7(显式设置。
glUniformMatrix4fv在默认统一块中的指定位置设置了统一的值。这必须在glUseProgram安装ProgRoam后必须完成。