C ++ OpenGL ShadowMap Проблема /Артефакты

В настоящее время я реализую базовое теневое отображение в моем C ++ Custom Engine с помощью GLSL 4.10 . В настоящее время он работает с основным сглаживанием PCF и минимальным уменьшением нежелательных артефактов. Вот скриншот для справки:

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

<p> В последнее время я начал модифицировать конвейер теневой карты, чтобы уменьшить <strong> тень акне </strong>. После прочтения различных статей многие предлагают либо использовать значение смещения, которое вычитается из значения глубины, сравниваемого с теневой картой </p>

<pre><code>---- +: = 0 = + ----</code></pre>

<p> и /или отбраковать передние грани при рендеринге на теневую карту. </p>

<pre><code>---- +: = 1 = + ----</code></pre>

<p> Отбраковка лицевых поверхностей уменьшает большинство теневых угрей, но создает еще одну проблему, о которой не упоминалось ни в одной из статей. Снимок экрана ниже показывает проблему. Если вы посмотрите на белую коробку перед рогатым существом, вы заметите, что тень существ бросается на другую сторону коробки. Это связано с тем, что передние поверхности коробки отбираются, что приводит к тому, что задние поверхности сравнивают свои значения глубины с геометрией к северу от коробки. </p>

<p> <img src =

5 голосов | спросил Paul Renton 5 FriEurope/Moscow2014-12-05T04:09:33+03:00Europe/Moscow12bEurope/MoscowFri, 05 Dec 2014 04:09:33 +0300 2014, 04:09:33

1 ответ


5

попробуйте использовать мультипликативный «смещение» вместо добавления:

shadowCoordinate.z *= 0.98;

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

За объектом не должно быть тени, поскольку свет не должен влиять на нее, когда свет полностью перекрывается самим объектом.

Глобальный окружающий свет не должен подвергаться воздействию теней, тени должны только отсекать свет, который бросает тень, а не другие огни.

vec3 output_color = ambient * material_diffuse;
foreach(light){
  float shadow_masking = light.CalculateShadow();
  output_color += light.Calculate(material_diffuse, material_specular) * shadow_masking;
}

Вот 3 цветных точечных огня с использованием теневого литья cubemap и 1 направленного. Теневые карты выдаются лицевой стороной (обычная отбраковка задней поверхности). Однопроходное форвард-затенение. И мультипликативный «смещение» 1,02 применяется к глубине тени. Интерполяция глубины теней. Канавки колонок на самом деле моделируются (не нормальные карты) для стресс-теста на самозатенение и тени. 3 маленьких шара являются точечными источниками света. Представлен на nVidia GTX 560M. Минимальным требованием является GLSL 1.1 (OpenGL 2.0). несколько источников света 3 точки, 1 направленный

Изменить: добавление псевдокода внутренних элементов sample2DShadow vs sampler2D

sample2DShadow:

float A = Nearest(tex, floor(coord.xy + vec2(0, 0))).r < coord.z ? 1.0 : 0.0;
float B = Nearest(tex, floor(coord.xy + vec2(1, 0))).r < coord.z ? 1.0 : 0.0;
float C = Nearest(tex, floor(coord.xy + vec2(0, 1))).r < coord.z ? 1.0 : 0.0;
float D = Nearest(tex, floor(coord.xy + vec2(1, 1))).r < coord.z ? 1.0 : 0.0;
return Lerp( Lerp(A, B, fract(coord.x)), Lerp(C, D, fract(coord.x)), fract(coord.y));

sampler2D по текстуре глубины:

vec4 A = Nearest(tex, floor(coord.xy + vec2(0, 0))).rrrr;
vec4 B = Nearest(tex, floor(coord.xy + vec2(1, 0))).rrrr;
vec4 C = Nearest(tex, floor(coord.xy + vec2(0, 1))).rrrr;
vec4 D = Nearest(tex, floor(coord.xy + vec2(1, 1))).rrrr;
return Lerp( Lerp(A, B, fract(coord.x)), Lerp(C, D, fract(coord.x)), fract(coord.y));

Оба типа пробоотборников выполняют 1 билинейную интерполяцию, но sampler2DShadow делает это на логическом результате.

введите описание изображения здесь>> </p></body></html>

ответил Stephane Hockenhull 10 WedEurope/Moscow2014-12-10T06:54:31+03:00Europe/Moscow12bEurope/MoscowWed, 10 Dec 2014 06:54:31 +0300 2014, 06:54:31

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132