OpenGL gluLookat 不适用于着色器

Posted

技术标签:

【中文标题】OpenGL gluLookat 不适用于着色器【英文标题】:OpenGL gluLookat not working with shaders on 【发布时间】:2019-05-11 12:03:37 【问题描述】:

当我想使用 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); 

将“相机”移动到我希望它在着色器打开的位置

【问题讨论】:

@Rabbid76 我到底要告诉着色器做什么,为什么我必须使用制服? 从技术上讲,您不必必须使用制服 - 任何将转换数据传输到着色器的方法都可以。 Uniforms 只是在这种情况下最明显的方式,并且或多或少直接等同于实现在模拟您在此处使用的超过 25 年的矩阵堆栈废话时在您背后执行的操作(已弃用)到现在十多年了)。 【参考方案1】:

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


您有 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;

但请注意,几十年来,这已被弃用。请参阅Fixed Function Pipeline 和Legacy OpenGL。


我建议使用OpenGL Mathematics 之类的库来通过lookAt() 和uniform 变量计算视图矩阵:

#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);

    // [...]

统一位置由Layout qualifier (location = 7) 明确设置。glUniformMatrix4fv 在默认统一块中的指定位置设置统一值。这必须在glUseProgram 安装程序后完成。

【讨论】:

太好了,谢谢,我采纳了你的建议,效果很好。 第二个,顺便说一句,你知道有什么好的教程网站可以从一开始就用 GLSL 学习 OpenGL 吗? @A.A.网络上可能有很多好的教程,甚至更多的坏教程。但我记得learnopengl.com对我帮助很大。

以上是关于OpenGL gluLookat 不适用于着色器的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL代码适用于GLFW,但不适用于Qt OpenGL

纹理不适用于我在 C++ 和 OpenGL 中的立方体

OpenGL的gluLookAt和glOrtho的关系

OpenGL 使用 gluLookat()

gluLookAt() 在 OpenGL 中无效

gluLookAt 似乎产生了错误的视图,OpenGL