[ShaderX5] 2.7 Animating Vegetation Using GPU Programs

1,521 views
1,416 views

Published on

Published in: Technology, Business
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,521
On SlideShare
0
From Embeds
0
Number of Embeds
139
Actions
Shares
0
Downloads
10
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

[ShaderX5] 2.7 Animating Vegetation Using GPU Programs

  1. 1. ShaderX52.7 Animating Vegetation Using GPU Programs<br />http://ohyecloudy.com<br />http://cafe.naver.com/shader.cafe<br />
  2. 2. Introduction<br />잔잔한 바람에 흔들리는 식물을 구현한다.<br />vertex animation을 사용.<br />static lightmap<br />유의 사항 : z-up right-hand 좌표계를 사용했다.<br />
  3. 3. 적용 가능한 식물<br />palms<br />birches<br />mushrooms<br />grass<br />weeds<br />flowers<br />scrub<br />
  4. 4. 구현 단계<br />Animate Vegetation<br />일단 움직이게 한다.<br />Adding Chaos to Vertex Movement<br />Lightmap and Height Bias<br />개선<br />
  5. 5. Vertex Shader<br />uniform float time;<br />const float magnitude = 0.006;<br />varying vec2 texCoords;<br />// varying : 모든 vertex마다 정의하고 pixel shader에서는 보간된 값을 갖는다.<br />void main()<br />{<br /> float amplitude = magnitude * gl_Vertex.z;<br />vec4 wave =<br /> amplitude * <br /> vec4( sin(time), cos(time), 0, 0);<br /> vec4 vert = gl_Vertex + wave;<br /> vert.w = 1.0;<br /> gl_Position = gl_ModelViewProjectionMatrix * vert;<br /> texCoord = gl_MultiTexCoord0.xy;<br />}<br />
  6. 6. 문제점<br />mesh group이 하나일 때는 그럴듯하다.<br />복수의 mesh group일 때는 문제<br />wave 변수인 time이 똑같다.<br />
  7. 7. 구현 단계<br />Animate Vegetation<br />Adding Chaos to Vertex Movement<br />단조로운 움직임을 없앤다.<br />Lightmap and Height Bias<br />개선<br />
  8. 8. Vertex Shader<br />vec4 wave = amplitude <br /> * vec4( sin(time), cos(time), 0, 0);<br />vec4 wave = amplitude * <br /> vec4( sin(time + gl_Vertex.x), <br /> cos(time + gl_Vertex.y), 0, 0);<br /><ul><li>Vertex 마다 다른 wave 값을 갖는다.
  9. 9. 움직임이 부드럽다.
  10. 10. 이웃한 vertex끼리 차이가 작다.</li></li></ul><li>문제점<br />World 좌표로 계산한다.<br />amplitude 값이 높이에 비례한다. <br /><ul><li>Z 좌표가 0인 object에 비해 50인 object의 움직임이 너무 과하다.</li></li></ul><li>구현 단계<br />Animate Vegetation<br />Adding Chaos to Vertex Movement<br />Lightmap and Height Bias<br />라이트 적용<br />Height bais를 사용한 amplitude 보정.<br />개선<br />
  11. 11. Vertex Shader<br />float amplitude = magnitude * (gl_Vertex.z);<br />float amplitude = magnitude<br /> * (gl_Vertex.z – gl_Color.a);<br />Lightmap<br />
  12. 12. Fragment Shader(Pixel Shader)<br />uniform sampler2D baseMap;<br />varying vec4 vertColor;<br />varying vec2 texCoords;<br />void main()<br />{<br /> vec4 mapColor = texture2D(baseMap, texCoords);<br /> vec3 fragColor = mapColor.rgb * vertColor.rgb;<br />float trans = step(0.5, mapColor.a);<br /> gl_FragColor = vec4(fragColor.rgb, trans);<br />}<br /><ul><li>transparency artifact 제거
  13. 13. 텍스쳐 필터링, 밉맵핑이 원인.</li>

×