Как вы преобразуете направленный свет в экранные координаты в современном GLSL? - PullRequest
2 голосов
/ 17 декабря 2011

Я переключаю свои шейдеры с использования конвейера с фиксированными функциями OpenGL. Раньше OpenGL автоматически преобразовывал огни для меня, но теперь мне нужно сделать это самому.

В моем вершинном шейдере есть следующий код GLSL:

//compute all of the light vectors. we want normalized vectors 
//from the vertex towards the light
for(int i=0;i < NUM_LIGHTS; i++)
{
    //if w is 0, it's a directional light, it is a vector 
    //pointing from the world towards the light source
    if(u_lightPos[i].w == 0)
    {
        vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));
        v_lightDir[i] = transformedLight;
    }
    else
    {
        //this is a positional light, transform it by the view*projection matrix
        vec4 transformedLight = u_vp_matrix * u_lightPos[i];

        //subtract the vertex from the light to get a vector from the vertex to the light
        v_lightDir[i] = normalize(vec3(transformedLight - gl_Position));
    }
}

Что мне заменить ??? со строкой vec3 transformedLight = normalize(vec3(??? * u_lightPos[i]));?

У меня уже есть следующие матрицы в качестве входных данных:

uniform mat4 u_mvp_matrix;//model matrix*view matrix*projection matrix
uniform mat4 u_vp_matrix;//view matrix*projection matrix
uniform mat3 u_normal_matrix;//normal matrix for this model

Не думаю, что это что-то из этого. Очевидно, это не матрица mvp или нормальная матрица, потому что они специфичны для текущей модели, и я пытаюсь преобразовать ее для просмотра координат. Однако я не думаю, что это матрица vp, потому что она включает переводы, и я не хочу переводить вектор.

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

Ответы [ 2 ]

4 голосов
/ 17 декабря 2011

Предполагается, что вы должны преобразовать световое положение / направление в пространство просмотра на CPU , а не в шейдере.Это униформа;это делается один раз за кадр на свет.Оно не меняется, поэтому нет необходимости, чтобы каждая вершина вычисляла его.Это пустая трата времени.

4 голосов
/ 17 декабря 2011

Вы можете использовать ту же матрицу view_projection.Да, эта матрица включает в себя перевод, но поскольку вектор света имеет значение w = 0, умножение матрицы не будет применено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...