Отображение отражений в GLSL - PullRequest
0 голосов
/ 08 февраля 2012

Я пытаюсь получить отображение отражения с картой куба, работающей в OpenGL ES 2.0. Я не уверен, правильно ли я рассчитываю направление отражения, чтобы передать кубу sampleler в фрагментном шейдере.

Для начала у меня есть матрицы Проекция, Модель и Вид, а также комбинированная матрица ModelView. Вот код моего вершинного шейдера в GLSL:

attribute vec4 Position;
attribute vec3 Normal;

uniform mat4 Projection;
uniform mat4 ModelView;
uniform mat3 Model;
uniform mat4 ModelViewProjectionMatrix;
uniform vec3 EyePosition;

varying vec3 ReflectDir;


void main()
{
    gl_Position = Projection * ModelView * Position;
    mediump vec3 EyeDir = normalize(Position.xyz - EyePosition);

    // Reflect eye direction by normal, and transform to world space
    ReflectDir = Model * reflect(EyeDir, Normal);
}

Мои предположения: EyeDirection должен находиться в объектном пространстве. (Правильный?) Как мне получить EyePosition в объектном пространстве? Должен ли я просто преобразовать положение камеры (то есть всегда в {0,0,0} в OpenGL?) С помощью обратной матрицы ModelView?

Я пробовал это, но мой фрагментный шейдер окрашивает все в черный цвет, как будто ReflectDir неверен.

Кто-нибудь получил рабочий пример отображения отражения OpenGL ES 2.0 (с помощью samplerCube), работающего в Xcode?

1 Ответ

5 голосов
/ 22 октября 2012

Обычный подход состоит в том, чтобы получить и направление глаза, и нормаль в Мировая система координат .Затем вектор поиска вычисляется как

vec3 lookup = normalize(reflect(EyeDir, Normal));

...