Не так гладкое затенение
Вопрос
Затенение Blinn-Phong ...?
Так что проблема, имеющая, как приведенное выше изображение, надеюсь, иллюстрирует, в том, что я не могу по-видимому, чтобы мои спекулярные основные моменты гладко плавно. Проблема - это резкая среза вдоль краев лица, которое не должно происходить. Диффузное освещение, кажется, работает довольно хорошо, и он использует те же интерполированные значения. Вот код для зеркальных ярких моментов Blinn-Phong:
vec3 halfAngle = normalize(lightDirection.xyz + viewRay);
float blinnTerm = dot(normal.xyz, halfAngle);
blinnTerm = clamp(blinnTerm, 0.0f, 1.0f);
blinnTerm = pow(blinnTerm, 300.0f);
float specIntensity = intensity * blinnTerm;
vec4 specColour = specIntensity * specColour;
.
lightDirection
является постоянным, он бесконечно далеко (то есть. Солнце). Что касается ViewRay, он рассчитывается в вершине Header, используя матрицу проекции:
viewRay = vec3(-(UV.x * 2.0f - 1.0f) / projection[0].x,
-(UV.y * 2.0f - 1.0f) / projection[1].y,
1.0f);
.
Я использую отсроченные рендеринга, где происходят значения ультрафиолета (рендеринг к полноэкранной текстуры).
Единственное, о чем я могу думать, так это то, что нормальная интерполяция просто не достаточно гладко. Но если это так, как бы я пошел по исправлению? (Я храним нормы как 16-битные поплавки, но поднятие его до 32 бит не было никакой разницы).
Решение
и чайник сейчас исправлен!Там был этот вопрос с интерполяцией нормалей, но, к счастью, это было простое исправление;Я нормализую нормальные нормы в моем вершине шейдера, затем интерполизируя, а не сначала интерполировать, а затем нормализую.Это все еще не идеально, но это, безусловно, улучшение!
Урок здесь: Если ваше изображение выглядит плоским, вы, вероятно, делаете что-то, что вы не должны делать в шейдере вершины.