Шейдеры Тесселяции

Шейдеры и все-все-все.

Шейдеры Тесселяции

Сообщение Anton1987ru 13 дек 2012, 07:38

Нашёл шейдеры Тесселяции для Юнити , идут только для версии 4 с включённым режимом D3Dx11
No GPU tessellation
Синтаксис:
  1. Shader "Tessellation Sample" { 
  2. Properties { 
  3. _MainTex ("Base (RGB)", 2D) = "white" {} 
  4. _DispTex ("Disp Texture", 2D) = "gray" {} 
  5. _NormalMap ("Normalmap", 2D) = "bump" {} 
  6. _Displacement ("Displacement", Range(0, 1.0)) = 0.3 
  7. _Color ("Color", color) = (1,1,1,0) 
  8. _SpecColor ("Spec color", color) = (0.5,0.5,0.5,0.5) 
  9. SubShader { 
  10. Tags { "RenderType"="Opaque" } 
  11. LOD 300 
  12.  
  13. CGPROGRAM 
  14. #pragma surface surf BlinnPhong addshadow fullforwardshadows vertex:disp nolightmap 
  15. #pragma target 5.0 
  16.  
  17. struct appdata { 
  18. float4 vertex : POSITION; 
  19. float4 tangent : TANGENT; 
  20. float3 normal : NORMAL; 
  21. float2 texcoord : TEXCOORD0; 
  22. }; 
  23.  
  24. sampler2D _DispTex; 
  25. float _Displacement; 
  26.  
  27. void disp (inout appdata v) 
  28. float d = tex2Dlod(_DispTex, float4(v.texcoord.xy,0,0)).r * _Displacement; 
  29. v.vertex.xyz += v.normal * d; 
  30.  
  31. struct Input { 
  32. float2 uv_MainTex; 
  33. }; 
  34.  
  35. sampler2D _MainTex; 
  36. sampler2D _NormalMap; 
  37. fixed4 _Color; 
  38.  
  39. void surf (Input IN, inout SurfaceOutput o) { 
  40. half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
  41. o.Albedo = c.rgb; 
  42. o.Specular = 0.2; 
  43. o.Gloss = 1.0; 
  44. o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex)); 
  45. ENDCG 
  46. FallBack "Diffuse" 

Изображение

Fixed amount of tessellation
Синтаксис:
  1. Shader "Tessellation Sample" { 
  2. Properties { 
  3. _Tess ("Tessellation", Range(1,32)) = 4 
  4. _MainTex ("Base (RGB)", 2D) = "white" {} 
  5. _DispTex ("Disp Texture", 2D) = "gray" {} 
  6. _NormalMap ("Normalmap", 2D) = "bump" {} 
  7. _Displacement ("Displacement", Range(0, 1.0)) = 0.3 
  8. _Color ("Color", color) = (1,1,1,0) 
  9. _SpecColor ("Spec color", color) = (0.5,0.5,0.5,0.5) 
  10. SubShader { 
  11. Tags { "RenderType"="Opaque" } 
  12. LOD 300 
  13.  
  14. CGPROGRAM 
  15. #pragma surface surf BlinnPhong addshadow fullforwardshadows vertex:disp tessellate:tessFixed nolightmap 
  16. #pragma target 5.0 
  17.  
  18. struct appdata { 
  19. float4 vertex : POSITION; 
  20. float4 tangent : TANGENT; 
  21. float3 normal : NORMAL; 
  22. float2 texcoord : TEXCOORD0; 
  23. }; 
  24.  
  25. float _Tess; 
  26.  
  27. float4 tessFixed() 
  28. return _Tess; 
  29.  
  30. sampler2D _DispTex; 
  31. float _Displacement; 
  32.  
  33. void disp (inout appdata v) 
  34. float d = tex2Dlod(_DispTex, float4(v.texcoord.xy,0,0)).r * _Displacement; 
  35. v.vertex.xyz += v.normal * d; 
  36.  
  37. struct Input { 
  38. float2 uv_MainTex; 
  39. }; 
  40.  
  41. sampler2D _MainTex; 
  42. sampler2D _NormalMap; 
  43. fixed4 _Color; 
  44.  
  45. void surf (Input IN, inout SurfaceOutput o) { 
  46. half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
  47. o.Albedo = c.rgb; 
  48. o.Specular = 0.2; 
  49. o.Gloss = 1.0; 
  50. o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex)); 
  51. ENDCG 
  52. FallBack "Diffuse" 

Изображение

Distance-based tessellation
Синтаксис:
  1. Shader "Tessellation Sample" { 
  2. Properties { 
  3. _Tess ("Tessellation", Range(1,32)) = 4 
  4. _MainTex ("Base (RGB)", 2D) = "white" {} 
  5. _DispTex ("Disp Texture", 2D) = "gray" {} 
  6. _NormalMap ("Normalmap", 2D) = "bump" {} 
  7. _Displacement ("Displacement", Range(0, 1.0)) = 0.3 
  8. _Color ("Color", color) = (1,1,1,0) 
  9. _SpecColor ("Spec color", color) = (0.5,0.5,0.5,0.5) 
  10. SubShader { 
  11. Tags { "RenderType"="Opaque" } 
  12. LOD 300 
  13.  
  14. CGPROGRAM 
  15. #pragma surface surf BlinnPhong addshadow fullforwardshadows vertex:disp tessellate:tessDistance nolightmap 
  16. #pragma target 5.0 
  17. #include "Tessellation.cginc" 
  18.  
  19. struct appdata { 
  20. float4 vertex : POSITION; 
  21. float4 tangent : TANGENT; 
  22. float3 normal : NORMAL; 
  23. float2 texcoord : TEXCOORD0; 
  24. }; 
  25.  
  26. float _Tess; 
  27.  
  28. float4 tessDistance (appdata v0, appdata v1, appdata v2) { 
  29. float minDist = 10.0; 
  30. float maxDist = 25.0; 
  31. return UnityDistanceBasedTess(v0.vertex, v1.vertex, v2.vertex, minDist, maxDist, _Tess); 
  32.  
  33. sampler2D _DispTex; 
  34. float _Displacement; 
  35.  
  36. void disp (inout appdata v) 
  37. float d = tex2Dlod(_DispTex, float4(v.texcoord.xy,0,0)).r * _Displacement; 
  38. v.vertex.xyz += v.normal * d; 
  39.  
  40. struct Input { 
  41. float2 uv_MainTex; 
  42. }; 
  43.  
  44. sampler2D _MainTex; 
  45. sampler2D _NormalMap; 
  46. fixed4 _Color; 
  47.  
  48. void surf (Input IN, inout SurfaceOutput o) { 
  49. half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
  50. o.Albedo = c.rgb; 
  51. o.Specular = 0.2; 
  52. o.Gloss = 1.0; 
  53. o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex)); 
  54. ENDCG 
  55. FallBack "Diffuse" 

Изображение

Edge length based tessellation
Синтаксис:
  1. Shader "Tessellation Sample" { 
  2. Properties { 
  3. _EdgeLength ("Edge length", Range(2,50)) = 15 
  4. _MainTex ("Base (RGB)", 2D) = "white" {} 
  5. _DispTex ("Disp Texture", 2D) = "gray" {} 
  6. _NormalMap ("Normalmap", 2D) = "bump" {} 
  7. _Displacement ("Displacement", Range(0, 1.0)) = 0.3 
  8. _Color ("Color", color) = (1,1,1,0) 
  9. _SpecColor ("Spec color", color) = (0.5,0.5,0.5,0.5) 
  10. SubShader { 
  11. Tags { "RenderType"="Opaque" } 
  12. LOD 300 
  13.  
  14. CGPROGRAM 
  15. #pragma surface surf BlinnPhong addshadow fullforwardshadows vertex:disp tessellate:tessEdge nolightmap 
  16. #pragma target 5.0 
  17. #include "Tessellation.cginc" 
  18.  
  19. struct appdata { 
  20. float4 vertex : POSITION; 
  21. float4 tangent : TANGENT; 
  22. float3 normal : NORMAL; 
  23. float2 texcoord : TEXCOORD0; 
  24. }; 
  25.  
  26. float _EdgeLength; 
  27.  
  28. float4 tessEdge (appdata v0, appdata v1, appdata v2) 
  29. return UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, _EdgeLength); 
  30.  
  31. sampler2D _DispTex; 
  32. float _Displacement; 
  33.  
  34. void disp (inout appdata v) 
  35. float d = tex2Dlod(_DispTex, float4(v.texcoord.xy,0,0)).r * _Displacement; 
  36. v.vertex.xyz += v.normal * d; 
  37.  
  38. struct Input { 
  39. float2 uv_MainTex; 
  40. }; 
  41.  
  42. sampler2D _MainTex; 
  43. sampler2D _NormalMap; 
  44. fixed4 _Color; 
  45.  
  46. void surf (Input IN, inout SurfaceOutput o) { 
  47. half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
  48. o.Albedo = c.rgb; 
  49. o.Specular = 0.2; 
  50. o.Gloss = 1.0; 
  51. o.Normal = UnpackNormal(tex2D(_NormalMap, IN.uv_MainTex)); 
  52. ENDCG 
  53. FallBack "Diffuse" 

Изображение

Phong Tessellation
Синтаксис:
  1. Shader "Phong Tessellation" { 
  2. Properties { 
  3. _EdgeLength ("Edge length", Range(2,50)) = 5 
  4. _Phong ("Phong Strengh", Range(0,1)) = 0.5 
  5. _MainTex ("Base (RGB)", 2D) = "white" {} 
  6. _Color ("Color", color) = (1,1,1,0) 
  7. SubShader { 
  8. Tags { "RenderType"="Opaque" } 
  9. LOD 300 
  10.  
  11. CGPROGRAM 
  12. #pragma surface surf Lambert vertex:dispNone tessellate:tessEdge tessphong:_Phong nolightmap 
  13. #include "Tessellation.cginc" 
  14.  
  15. struct appdata { 
  16. float4 vertex : POSITION; 
  17. float3 normal : NORMAL; 
  18. float2 texcoord : TEXCOORD0; 
  19. }; 
  20.  
  21. void dispNone (inout appdata v) { } 
  22.  
  23. float _Phong; 
  24. float _EdgeLength; 
  25.  
  26. float4 tessEdge (appdata v0, appdata v1, appdata v2) 
  27. return UnityEdgeLengthBasedTess (v0.vertex, v1.vertex, v2.vertex, _EdgeLength); 
  28.  
  29. struct Input { 
  30. float2 uv_MainTex; 
  31. }; 
  32.  
  33. fixed4 _Color; 
  34. sampler2D _MainTex; 
  35.  
  36. void surf (Input IN, inout SurfaceOutput o) { 
  37. half4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color; 
  38. o.Albedo = c.rgb; 
  39. o.Alpha = c.a; 
  40.  
  41. ENDCG 
  42. FallBack "Diffuse" 

Изображение
Anton1987ru
UNец
 
Сообщения: 2
Зарегистрирован: 30 июн 2012, 00:03

Re: Шейдеры Тесселяции

Сообщение Anton1987ru 13 дек 2012, 07:53

Собственно описание шейдеров , как я понял:
1) No GPU tessellation - шейдер не изменяет геометрию (???) 8()
2) Fixed amount of tessellation - Тесселяционный с фиксированным значением на которое могут разбиться полигоны - то есть классический не оптимизированный шейдер.(максимальное качество)
3)Distance-based tessellation - Тесселяционный шейдер качество которого зависит от дальности прорисовки в кадре , то есть наиболее полезная версия шейдера (вблизи максимальное качество вдали минимальное качество)
4) Edge length based tessellation - Насколько я понял шейдер разбиваеться равномерно по всей поверхности и адаптивно меняет качество геометрии , грубо говоря (среднее качество вблизи - среднее качество вдали )
5) Phong Tessellation - На сколько я понял этот шейдер корректно работает с затенением по фонгу
Anton1987ru
UNец
 
Сообщения: 2
Зарегистрирован: 30 июн 2012, 00:03

Re: Шейдеры Тесселяции

Сообщение magoga 13 дек 2012, 15:44

No GPU tessellation - шейдер не изменяет геометрию (???) 8()

все он там меняет как при тесселяции, и деформирует, и выдавливает, просто полигонаж не меняет
Distance-based tessellation наиболее полезная версия шейдера

тоже не верно
Distance based вообще эффективен практически только в играх от первого лица.
в GUI в сайдскролеерах и в TopDown играх типа дьяблы, куда эффективнее использовать Fixed amount, и вообще назвать его не оптимизированным неправильно, т.к тут вопрос в том, где и как его применять.
конечно глупо применять Fixed amount например в шутере, тк просто забьешь себе всю сцену миллионами полигонов,
Но Distance based математически вычисляется в разы сложнее чем Fixed amount т.к он каждый кадр проверяет дистанцию до всех объектов, и до каждого полигона в этих объектах, и исходя из этой дистанции добавляет нужно кол-во полигонов, поэтому также глупо было бы его использовать в играх где дистанция между камерой и объектами не меняются, это просто дает ненужную нагрузку на видяху.
да и вообще я не понял почему ты Fixed amount неоптимизированным назвал ;))
математически он реально куда легче считается чем все остальные алгоритмы, просто применять его надо правильно ))

Phong Tessellation это не шедер который коррекно работает с затенение по фонгу, с ним любая тесселяция нормально работает.
фонг теселяция при добавлении полигонов, учитывает изначальную форму объекта и просто сглаживает модель.
http://perso.telecom-paristech.fr/~boub ... lation.pdf
Аватара пользователя
magoga
UNIт
 
Сообщения: 98
Зарегистрирован: 22 мар 2010, 21:08

Re: Шейдеры Тесселяции

Сообщение Woolf 13 дек 2012, 22:52

Офигенно.. Жаль только, что дх11 пока далеко не у всех.. Еще лет 5 надо..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2