OpenGL gluLookat не работает с шейдерами на - PullRequest
1 голос
/ 11 мая 2019

Когда я хочу использовать 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); 
}

Переместите «камеру» туда, где я хочу, чтобы шейдеры на

1 Ответ

2 голосов
/ 11 мая 2019

Когда вы используете шейдерную программу, атрибуты координат вершины не обрабатываются магическим образом текущими матрицами.Шейдерная программа должна выполнять преобразования координат вершин.


У вас есть 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 Matmatics для вычисления матрицы вида по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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...