2015-03-08 2 views
0

Из-за ограничений мне приходится вычислять нормали вершин внутри моего геометрического шейдера. Из-за этого ограничения нормали являются первыми, а не интерполированными между гранями на вершине, что означает, что направленное освещение в пикселях - это просто отходы. Поскольку нормали известны только из Geometry Shader дальше, я не могу делать какую-либо математику освещения в Vertex Shader.Направленное освещение на лице с использованием геометрического шейдера?

Нормали, которые вычислены в Geometry Shader, находятся в пространстве экрана, но они верны из некоторых тестов, которые я выполнил.

Я могу обеспечить направление света в мировом пространстве или умножить на матрицу вида/проекции/транспонированного/инвертированного изображения.

Следующий код некоторые-то, что работает, но изменения на угол камеры/lightdirection:

void FlipFaceGS(triangle PS_IN input[3], inout TriangleStream<PS_IN> OutputStream) 
{ 
    PS_IN v1 = input[0]; 
    PS_IN v2 = input[1]; 
    PS_IN v3 = input[2]; 

    float3 faceEdgeA = v2.pos - v1.pos; 
    float3 faceEdgeB = v3.pos - v1.pos; 
    float3 faceNormal = normalize(cross(faceEdgeA, faceEdgeB)); 

    v1.norm = faceNormal; 
    v2.norm = faceNormal; 
    v3.norm = faceNormal; 

    float4 newColor = (v1.color * Light1Color * max(0, dot(v1.norm, Light1Direction))); 
    newColor.a = v1.color.a;//we don't want to affect the alpha levels 

    v1.color = newColor; 
    v2.color = newColor; 
    v3.color = newColor; 

    OutputStream.Append(v1); 
    OutputStream.Append(v2); 
    OutputStream.Append(v3); 
    OutputStream.RestartStrip(); 
} 

На приведенном выше примере, lightdirection умножается на ViewProjection матрицу камеры и нормированные перед отправкой на GPU.

Какова математика, необходимая для правильного вычисления света в Geometry Shader?

+0

Это не делает «per-vertex» освещение. Это делает «на лице» освещение с репликацией вершин. Вероятно, это будет медленным, так как вы выполняете вершинную репликацию в GS, хотя вы, по крайней мере, производят одинаковое количество выходов, поскольку вы принимаете входные данные, что означает, что вы не получите удар по наихудшей производительности GS. –

+0

@ChuckWalbourn Я исправил заголовок, если вы знаете какие-либо параметры освещения с независимым вершинным порядком, я бы хотел их услышать :) – ManIkWeet

ответ

0

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

+0

«Тем не менее, пространство для клипов не подходит для подсчета освещения». Это сделало это для меня, спасибо! – ManIkWeet

Смежные вопросы