Не такая плавная заливка

Блинн-фонг затенение...?

нормативыBlinn-Фонг

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

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, он вычисляется в вершинном шейдере примерно так, используя проекционную матрицу:

viewRay = vec3(-(UV.x * 2.0f - 1.0f) / projection[0].x,
               -(UV.y * 2.0f - 1.0f) / projection[1].y,
                     1.0f);

Я использую отложенный рендеринг, из которого берутся значения UV (рендеринг в полноэкранную текстуру).

Единственное, о чем я могу думать, - это то, что обычная интерполяция не достаточно гладкая. Но если это так, как бы я исправить это? (Я храню нормали как 16-битные числа с плавающей запятой, но увеличение до 32 бит не имеет значения).

1 ответ

Решение

введите описание изображения здесь

И чайник теперь исправлен! Была проблема с интерполяцией нормалей, но, к счастью, это было легко исправить; Я нормализовал нормали в моем вершинном шейдере, затем интерполировал, а не интерполировал сначала, а затем нормализовал. Это все еще не идеально, но это, безусловно, улучшение!

Урок здесь: если ваше изображение выглядит плоским, вы, вероятно, делаете то, чего не должны делать в вершинном шейдере.

Другие вопросы по тегам