GLSL Phong Light, проблема с камерой - PullRequest
0 голосов
/ 27 мая 2011

Я только начал писать фонг-шейдер

vert:
varying vec3 normal, eyeVec;
#define MAX_LIGHTS 8
#define NUM_LIGHTS 3
varying vec3 lightDir[MAX_LIGHTS];

void main() {
    gl_Position = ftransform();
    normal = gl_NormalMatrix * gl_Normal;
    vec4 vVertex = gl_ModelViewMatrix * gl_Vertex;
    eyeVec = -vVertex.xyz;
    int i;

    for (i=0; i<NUM_LIGHTS; ++i){
        lightDir[i] = vec3(gl_LightSource[i].position.xyz - vVertex.xyz);
    }
}

Я знаю, что мне нужно получить положение камеры с помощью uniform, но как и где поставить это значение?

пс,Я использую OpenGL 2.0

1 Ответ

4 голосов
/ 27 мая 2011

Вам не нужно передавать положение камеры, потому что, ну, в OpenGL камеры нет.

Расчеты освещения выполняются в пространстве глаза / мира, то есть после умножения на матрицу вида модели, которая также выполняет «позиционирование камеры». Так что на самом деле вы уже получили правильные вещи на месте. использование ftransform() немного неэффективно, поскольку вы делаете половину того, что он делает снова (gl_ModelviewMatrix * gl_Vertex, вы можете превратить это в ftransform, добавив gl_Position = gl_ProjectionMatrix * eyeVec)

Таким образом, если ваши огни, кажется, двигаются, когда ваша «камера» трансформируется, вы не изменяете положения источника света должным образом. Либо предварительно вычислите преобразованные позиции света, либо преобразуйте их также в шейдер. Это скорее вопрос выбранного соглашения, меньшее ограничение при использовании шейдеров.

...