2015-11-03 3 views
1

Я пытаюсь реализовать океанскую сцену с C++ и DirectX11. В настоящее время у меня есть спроектированная сетка, волны Герстнера и базовое затенение. Моя проблема в том, что когда я нацеливаю камеру по горизонтали, так что я вижу водный горизонт, на расстоянии проецируемая сетка становится недостаточной даже при высоких числах вершин. Эти скриншоты иллюстрируют проблему:Проецируемый сетчатый горизонт воды

shaded water surface

wireframe water surface

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

Любые идеи?

+0

Я думаю, что http://computergraphics.stackexchange.com/ является лучшим местом для задаю этот вопрос , –

+0

Спасибо за подсказку, я тоже задал вопрос. –

ответ

1

Бенедикту Bitterli и joojaa ответил на мой вопрос здесь: https://computergraphics.stackexchange.com/questions/1681/projected-grid-water-horizon-detail

Я выбрал ленивое решение на данный момент. Я вычисляю коэффициент затухания с расстояния от камеры в вершинном шейдере, и я постепенно выравниваю волны на расстоянии.

Функция:

float CalculateWaveAttenuation(float d, float dmin, float dmax) 
{ 
    // Quadratic curve that is 1 at dmin and 0 at dmax 
    // Constant 1 for less than dmin, constant 0 for more than dmax 
    if (d > dmax) return 0.f; 
    else 
    { 
     return saturate((1.f/((dmin-dmax)*(dmin-dmax))) * ((d-dmax) * (d-dmax))); 
    } 
} 

Вот результаты:

shaded wireframe

0

Вы должны попробовать реализовать алгоритм «основного затенения» в шейдере фрагмента, а не в вершинном шейдере.

+0

Он реализован в пиксельном шейдере прямо сейчас. –

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