Отражения кубической карты openGL в пространстве вида неверны - PullRequest
2 голосов
/ 25 марта 2020

Я следую этому уроку , и мне удалось добавить карту куба в мою сцену. Затем я попытался добавить отражения к своему объекту, в отличие от учебника, я сделал свой GLSL-код в пространстве вида. Тем не менее, размышления кажутся немного странными. Они всегда отражают одну и ту же сторону независимо от того, под каким углом вы находитесь, в моем случае вы всегда видите камень на отраженном объекте, но камень находится только на одной стороне моей карты куба. Вот видео, показывающее эффект:

.

Я пробовал с другими объектами в форме, например, с кубом, и эффект тот же. Я также нашел эту книгу , которая показывает пример отражений в пространстве вида, и кажется, что я делаю что-то подобное, но это все равно не приведет к желаемому эффекту. Код моего вершинного шейдера:

#version 330 core
layout (location = 0) in vec3 aPos;
layout (location = 1) in vec3 normal;
layout (location = 2) in vec2 aTexCoord;

uniform mat4 Model;
uniform mat4 View;
uniform mat4 Projection;

out vec2 TexCoord;
out vec3 aNormal;
out vec3 FragPos;

void main()
{
    aNormal = mat3(transpose(inverse(View * Model))) * normal; 
    FragPos = vec3(View * Model * vec4(aPos,1.0));
    gl_Position = Projection * vec4(FragPos,1.0);
    TexCoord = aTexCoord;
}

Код моего вершины:

#version 330 core

out vec4 FragColor;

in vec3 FragPos;
in vec3 aNormal;

uniform samplerCube skybox;


void main(){
    vec3 I = normalize(FragPos);
    vec3 R = reflect(I,normalize(aNormal));
    FragColor = vec4(texture(skybox,R).rgb,1.0);
}

1 Ответ

3 голосов
/ 25 марта 2020

Поскольку вы выполняете вычисления в фрагментном шейдере в пространстве вида, отраженный вектор (R) также является вектором в пространстве вида. Кубическая карта (skybox) представляет карту окружающей среды в мировом пространстве. Вы должны преобразовать R пространство вида формы в мировое пространство. Это можно сделать с помощью матрицы обратного просмотра. Обратную матрицу можно вычислить с помощью встроенной функции glsl inverse:

#version 330 core

out vec4 FragColor;

in vec3 FragPos;
in vec3 aNormal;

uniform samplerCube skybox;
uniform mat4 View;

void main() {
    vec3 I      = normalize(FragPos);
    vec3 viewR  = reflect(I, normalize(aNormal));
    vec3 worldR = inverse(mat3(View)) * viewR;
    FragColor   = vec4(texture(skybox, worldR).rgb, 1.0);
}

Обратите внимание, что матрица представления преобразуется из мирового пространства. для просмотра пространства эта матрица обратного просмотра преобразует пространство вида в мировое пространство. См. Также Обратимая матрица .

...