1 / 29

Реализация алгоритма теневых объемов в DX10

Реализация алгоритма теневых объемов в DX10. Юрий Степаненко. Формирование теней с помощью теневых объемов. Z-pass. Light. Формирование теней с помощью теневых объемов. Z-fail. Light. Проблемы алгоритма теневых объемов в DX9. Нахождение теневого силуэта.

aelwen
Download Presentation

Реализация алгоритма теневых объемов в DX10

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Реализация алгоритма теневых объемов в DX10 Юрий Степаненко

  2. Формирование теней с помощью теневых объемов • Z-pass Light

  3. Формирование теней с помощью теневых объемов • Z-fail Light

  4. Проблемы алгоритматеневых объемов в DX9 • Нахождение теневого силуэта

  5. Проблемы алгоритматеневых объемов в DX9 • Нахождение теневого силуэта • Генерирование новой геометрии (собственно теневого объема)

  6. Решение проблем в DX10: Геометрический шейдер Input From CPU Point Line Strips Triangle Strips Vertex Shader Line with adjacency Geometry Shader Triangle with adjacency Raster Pixel Shader Output Point list Line strip Triangle strip Output Merger

  7. Традиционный алгоритм определения теневого силуэта Light • Вычисляем геометрическую нормаль N для текущего треугольника N

  8. Традиционный алгоритм определения теневого силуэта Light • Проверяем, направлена ли нормаль к источнику освещения N L

  9. Традиционный алгоритм определения теневого силуэта Light • Вычисляем геометрическую нормаль Ni для соседних треугольников N Ni

  10. Традиционный алгоритм определения теневого силуэта Light • Проверяем, повернута ли нормаль Ni также на источник освещения? N Li Ni

  11. Традиционный алгоритм определения теневого силуэта Light • Если нормали направлены по-разному, то добавить это ребро в теневой силуэт N Ni

  12. Традиционный алгоритм определения теневого силуэта Light • Из выбранного ребра формируем грань теневого объема N Ni

  13. Недостатки традиционного метода • Нужна информация о соседних треугольниках • Теневой силуэт отличается от гладкого силуэта освещенности (артефактам в виде «ступенек») • Теневой силуэт перемещается скачками • Много идентичных вычислений для каждого из треугольников • Численная неустойчивость*

  14. Недостатки традиционного метода Численная неустойчивость 2 1 2 2 1 1 N1 = { 1.0000, 0.0000, 0.0000 } N2 = { 0.0000, 0.9999, 0.0001 } N1 = { 1.0001, -0.0001, 0.0000 } N2 = { 0.0000, 1.0000, 0.0000 } L1 = { 0.0000, 0.7071, 0.7071 } L2 = { 0.0000, 0.8000, 0.6000 } dot( N1, L1 ) = 0.0000 dot( N2, L2 ) = 0.79998 dot( N1, L1 ) = -0.00007 dot( N2, L2 ) = 0.80000

  15. Недостатки традиционного метода Прмер «ступенчатых» артефактов

  16. Какой метод нам нужен? • Без дополнительной информации • Без артефактов в виде «ступенек» • Вычислительно эффективный • Численно устойчивый

  17. Новый метод определения теневого силуэта

  18. Достоинства нового метода • Не нужна информация о соседних треугольниках, достаточно сглаженной нормали • Теневой силуэт не отличается от гладкого силуэта освещенности • Теневой силуэт перемещается плавно, без скачков по ребрам модели • Идентичные вычислений выполняются один раз на вершину в вершинном шейдере • Численная устойчивость

  19. Новый метод определения теневого силуэта N1 Light • Используем просто сглаженную нормаль в вершинах треугольника N3 N2

  20. Новый метод определения теневого силуэта Light L1 • Находим для каждой вершины: NdotL[i] = dot(N[i], normalize(LightPos - Pos[i])); L3 L2

  21. Новый метод определения теневого силуэта Light NdotL[0]>0 • Строим новое ребро, используяlerp(...)позиций вершин на ребрах, гдеNdotLменяет свой знак NdotL[2]>0 NdotL[1]<0

  22. Новый метод определения теневого силуэта Light • Из построенного ребра формируем грань теневого объема

  23. Особенности нового метода определения теневого силуэта • Ребро силуэта вычисляется (строится), а не выбирается среди ребер объекта • Меньше лишних вычислений

  24. Геометрический шейдер (часть 1) [maxvertexcount(4)] void GSShadowmain( triangleadj GSShadowIn In[6], inout TriangleStream<PSShadowIn> ShadowTriangleStream ) { int nIndx; // Write pos for new verticies int nSign [3]; // Sign of dot(N, L) per vertex (-1 or zero) float fNDotL [3]; // dot(N, L) per vertex [-1; 1] float3 vNewPos [2]; // Position of new two verticies [unroll]for( int i=0; i<3; i++ ) { nSign [i] = asint( In[i*2].ndotl ); fNDotL[i] = abs ( In[i*2].ndotl ); } nIndx = 0; [flatten]if( (nSign[0]^nSign[1]) < 0 ) // First intersection { vNewPos[nIndx++] = lerp( In[0].pos, In[2].pos, fNDotL[0]/(fNDotL[0]+fNDotL[1]) ); } [flatten]if( (nSign[1]^nSign[2]) < 0 ) // First or last intersection { vNewPos[nIndx++] = lerp( In[2].pos, In[4].pos, fNDotL[1]/(fNDotL[1]+fNDotL[2]) ); } [flatten]if( (nSign[2]^nSign[0]) < 0 ) // The last intersection { vNewPos[nIndx ] = lerp( In[4].pos, In[0].pos, fNDotL[2]/(fNDotL[2]+fNDotL[0]) ); }

  25. Геометрический шейдер (часть 2) [branch]if( nIndx ) // OK, extrude shadow edge now { int i0, i1; [flatten]if( nSign[0] < 0 ) // We must swap positions { i0 = 1; i1 = 0; } else { i0 = 0; i1 = 1; } float3 vOutPos [4]; float3 vExtrude [2]; vExtrude[0] = normalize(vNewPos[i0] - g_vLightPos); vExtrude[1] = normalize(vNewPos[i1] - g_vLightPos); vOutPos[0] = vNewPos[i0] + vExtrude[0]; vOutPos[1] = vNewPos[i0] + vExtrude[0] * g_fExtrudeAmt; vOutPos[2] = vNewPos[i1] + vExtrude[1]; vOutPos[3] = vNewPos[i1] + vExtrude[1] * g_fExtrudeAmt; [unroll]for( int i=0; i<4; i++ ) { PSShadowIn Out; Out.pos = mul( float4(vOutPos[i], 1.0), g_mViewProj ); ShadowTriangleStream.Append( Out ); } } } // End of GSShadowmain

  26. Недостатки нового метода • Нормаль в вершинах должна быть сглаженной • Объект должен быть не только сглаженным, но и замкнутым • Слишком «изогнутые» треугольникимогут обрабатываться некорректно • Утечки освещения для вогнутых поверхностей

  27. Недостатки нового метода Утечки освещения для вогнутых поверхностей Light

  28. Ссылки [1]Morgan McGuire, John F. Hughes, and Kevin T. Egan; Mark J. Kilgard and Cass Everitt “Fast, Practical and Robust Shadows” http://developer.nvidia.com/object/fast_shadow_volumes.html [2]Cass Everitt and Mark J. Kilgard “Practical and Robust Stenciled Shadow Volumes for Hardware-Accelerated Rendering” http://developer.nvidia.com/object/robust_shadow_volumes.html

  29. Вопросы?

More Related