Не такая плавная заливка
Блинн-фонг затенение...?
Таким образом, проблема, которая, как я надеюсь, иллюстрирует вышеизложенное изображение, заключается в том, что я не могу добиться плавного затенения моих зеркальных бликов. Проблема заключается в резкой обрезке по краям лица, чего не должно быть. Рассеянное освещение работает достаточно хорошо и использует те же интерполированные значения. Вот код для бликовых бликов:
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 ответ
И чайник теперь исправлен! Была проблема с интерполяцией нормалей, но, к счастью, это было легко исправить; Я нормализовал нормали в моем вершинном шейдере, затем интерполировал, а не интерполировал сначала, а затем нормализовал. Это все еще не идеально, но это, безусловно, улучшение!
Урок здесь: если ваше изображение выглядит плоским, вы, вероятно, делаете то, чего не должны делать в вершинном шейдере.