c++ - OpenGL gluLookat 无法使用着色器

标签 c++ opengl glsl fragment-shader vertex-shader

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

但请注意,几十年来这已被弃用。参见 Fixed Function PipelineLegacy OpenGL .


我建议使用类似 OpenGL Mathematics 的库通过 lookAt() 计算 View 矩阵和一个 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 明确设置(位置 = 7)。
glUniformMatrix4fv在默认统一 block 中的指定位置设置统一值。这必须在 glUseProgram 安装程序后完成.

关于c++ - OpenGL gluLookat 无法使用着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56090164/

相关文章:

c++ - 是否有任何信号处理算法可以逆向工程如何通过人类的发声系统产生声波?

c++ - OpenGL 程序只显示屏幕后面的内容

opengl - 在 C++ 中使用 GLSL 和 OpenGL 中的 2D PNG 中的 3D 查找表

opengl - 针对昂贵的片段着色器进行优化

GLSL 片段着色器速度减慢

c++ - 在 C++ 中创建静态实例的未解决外部问题

c++ - SetWindowsHookEx 注入(inject)失败

c++ - 数据数组返回问题,覆盖

java - 将纹理绘制到帧缓冲区会扭曲纹理

c++ - GLSL无法编译没有插值的着色器(平面)