GLSL свет / подсветка движется с камерой - PullRequest
1 голос
/ 04 декабря 2011

VC ++ 2010, OpenGL, GLSL, SDL

Я перешел к шейдерам и столкнулся с проблемой, которая первоначально возникла при работе с конвейером ogl. То есть положение света, кажется, указывает в любом направлении, куда смотрит моя камера. В конвейере ogl это была просто зеркальная подсветка, которую можно было исправить с помощью:

glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);

Вот два шейдера:

Vertex

varying vec3 lightDir,normal;

void main()
{
    normal = normalize(gl_NormalMatrix * gl_Normal);
    lightDir = normalize(vec3(gl_LightSource[0].position));

    gl_TexCoord[0] = gl_MultiTexCoord0;
    gl_Position = ftransform();
}

Фрагмент

varying vec3 lightDir,normal;
uniform sampler2D tex;

void main()
{
    vec3 ct,cf;
    vec4 texel;
    float intensity,at,af;

    intensity = max(dot(lightDir,normalize(normal)),0.0);

    cf = intensity * (gl_FrontMaterial.diffuse).rgb + 
                        gl_FrontMaterial.ambient.rgb;
    af = gl_FrontMaterial.diffuse.a;

    texel = texture2D(tex,gl_TexCoord[0].st);
    ct = texel.rgb;
    at = texel.a;

    gl_FragColor = vec4(ct * cf, at * af);  
}

Любая помощь будет высоко ценится!

1 Ответ

3 голосов
/ 04 декабря 2011

Вопрос в том, в какой системе координат (системе отсчета) вы хотите, чтобы источники света были включены? Вероятно, "мир".

В конвейере с фиксированными функциями OpenGL, однако, нет понятия мировых координат, поскольку он использует матрицу modelview , которая преобразуется непосредственно из координат глаза (камеры) в координаты модели. Чтобы иметь «фиксированные» огни, вы можете сделать одно из следующих действий:

  • Классический подход OpenGL состоит в том, чтобы в каждом кадре настраивать матрицу вида модели только для преобразования ракурс (т. Е. Быть системой координат, в которой вы хотите указать свои позиции освещения) и затем используйте glLight для установки позиции (которая указана для применения матрицы вида модели к входным данным).

  • Поскольку вы используете шейдеры, у вас также может быть отдельная матрица модели и вида, и ваш шейдер может применять оба (вместо использования ftransform) к вершинам, но только матрицу вида к источникам света. Однако это означает больше операций с матрицами на каждую вершину и, вероятно, не особенно хорошая идея, если вы не ищете ясности, а не производительности.

...