Glsl Фонг шейдер и камера - PullRequest
1 голос
/ 07 декабря 2010

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

Итак, в моем вершинном шейдере мне нужно получить легкое положение и положение глаз.Вот мой код:

void main(void)
{
    vec3    p = vec3      ( gl_ModelViewMatrix * gl_Vertex );

    l = normalize (vec3 (gl_LightSource[0].position));
    v = normalize ( vec3 ( eyePos )  - p );
    n = normalize ( gl_NormalMatrix * gl_Normal );

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

В результате свет движется с движением камеры.Что именно мне нужно сделать здесь?Возможно без использования матриц non-opengl.

Есть ли пример освещения glsl с надлежащим управлением камерой?

* ОБНОВЛЕНИЕ *

БлагодаряКос, я справился с проблемой "свет движется с камерой", но вот еще одна:

У меня есть

glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glEnable(GL_LIGHT0);
ctLight -> enable();

glPushMatrix();
    glTranslatef(0, 0, 0);
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(2.0);
glPopMatrix();

glPushMatrix();
    glTranslatef(0, 0, 8);
    glRotatef(angle, 0, 1, 0);
    glutSolidTeapot(2.0);
glPopMatrix();

ctLight -> disable();
glDisable(GL_LIGHT0);

Теперь второй чайник горит так же, как один в (0, 0,0).Как это исправить?

Код вершинного шейдера в случае:

void main(void)
{
    vec3    p = vec3 ( gl_ModelViewMatrix * gl_Vertex );            // transformed point to world space

    l = normalize ( vec3 (gl_LightSource[0].position) );
    v = normalize ( - p );  

    h = normalize ( l + v );
    n = normalize ( gl_NormalMatrix * gl_Normal );                  // transformed n

    gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}

1 Ответ

3 голосов
/ 07 декабря 2010

Я мало что помню о "старых" функциях освещения в OpenGL, но я полагаю, что ваша проблема имеет недопустимое значение в gl_LightSource[0].position.

Как указать положение освещения (glLightParameterfv(GL_LIGHT_POSITION, ...);)?Самое главное, в каком состоянии находится матрица вида модели, когда вы их задаете?

Если матрица вида модели идентична, вы задаете положения света в пространстве глаза , что дает вамсоздается впечатление, что они движутся вместе с камерой (хорошо, помните, что камера всегда находится в положении (0,0,0), и движется мир).

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

Положение света умножается на матрицу вида модели вв момент спецификации, поэтому ваш шейдер всегда получит значение в глазном пространстве , что полезно - вам больше не нужно его изменять, поскольку вычисления освещения выполняются в глазном пространстве.Это также подразумевает, что eyePos должно быть просто (0,0,0) в ваших вычислениях, что делает v равным просто normalize(-p).

Кроме того, для достижения наилучших результатов выполняйте эти вычисления в фрагментном шейдере, а не в вершинном шейдере,:)

Надеюсь, это поможет.

...