Из-за ограничений мне приходится вычислять нормали вершин внутри моего геометрического шейдера. Из-за этого ограничения нормали являются первыми, а не интерполированными между гранями на вершине, что означает, что направленное освещение в пикселях - это просто отходы. Поскольку нормали известны только из 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?
Это не делает «per-vertex» освещение. Это делает «на лице» освещение с репликацией вершин. Вероятно, это будет медленным, так как вы выполняете вершинную репликацию в GS, хотя вы, по крайней мере, производят одинаковое количество выходов, поскольку вы принимаете входные данные, что означает, что вы не получите удар по наихудшей производительности GS. –
@ChuckWalbourn Я исправил заголовок, если вы знаете какие-либо параметры освещения с независимым вершинным порядком, я бы хотел их услышать :) – ManIkWeet