ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [번역] Effective Water Simulation from Physical Models
    Graphics/번역 2020. 9. 22. 01:32

    개인 공부용으로 번역한 거라 잘못 번역된 내용이 있을 수 있습니다.

    또한 원작자의 동의 없이 올려서 언제든 글이 내려갈 수 있습니다.

    출처 : developer.download.nvidia.com/books/HTML/gpugems/gpugems_ch01.html

     

    [GPU Gems] Chapter 1. Effective Water Simulation from Physical Models

     

    Mark Finch
    Cyan Worlds

     
    이 챕터는 GPU에서 넓은 연못(혹은 바다)를 시뮬레이션 하고 렌더링 하는 시스템에 대해서 설명합니다. 이 시스템은 동적 노멀맵 생성으로 메쉬 기반의 기하학적 물결(파동)들을 조합합니다. 이 시스템은 그림1-1에 있는 Cyan Worlds' Uru: Ages Beyond Myst에서 광범위하게 사용되면서, 실시간 게임 시나리오에 알맞다고 판명되었습니다.

     

     

     

    그림 1-1  Tranquil Pond

     

    1.1 Goals and Scope

    실시간 렌더링 기술은 몇년에 걸쳐 오프라인 렌더링으로 부터 왔습니다. Fast Fourier Transform(FFT) 기술은, Tessendorf 2001에서 윤곽이 잡힌, 충분히 넓은 샘플링 그리드에 대해서 믿을 수 없이 현실적인 결과를 생성합니다, 그리고 적당한 크기의 그리드는 소비자 수준의 PC에서 리얼타임으로 처리될 것입니다. Navier-Stokes 방정식의 간단한 형태를 위한 복셀기반 해결법도 가능합니다(Yann 2003). 비록 우리는 가장 발전된 단계에 아직 도달하진 않았지만, 오프라인 유체 시뮬레이션, Enright et al. 2002, 간격은 좁혀지고 있습니다. 이 챕터가 발간될 때 까지, FFT 라이브러리는 버택스와 픽셀 쉐이더에 대해서 사용가능 할 것입니다. 그러나 이것을 쓰는 당시에는 이 기술의 리얼타임 버젼은 CPU구현에서 제한되어져 있습니다.
     
    동시에, GPU에서 작동시키기에 충분한 물 시뮬레이션 모델 또한 발전하고 있습니다. lsidoro et al. 2002는 표면의 높이와 방향을 계산하기 위해서 4개의 sine 파동을 버택스 쉐이더에서 합하는 것을 설명합니다. Laeuchli 2002는 표면의 높이를 3개의 Gerstner 파동을 사용하여 계산하는 쉐이더를 제시했습니다.

     
    우리는 간단한 Sine 함수들을 합치는 것에서 시작합니다, 그리고나서 조금 더 복잡한 함수로 적절한 때 넘어갑니다. 우리는 또한 물 표면의 미세한 디테일을 얻기위한 동적 타일링 범프 맵을 생성하기 위해서 Periodic wave functions를 사용하여 픽셀 쉐이더의 영역으로 이 기술을 확장시킵니다

     
    이 챕터는 Sine 파동의 합으로 물을 근사하는 것이 종종 제시된 임시방편이 아니라는 것을 보여주면서, 시스템 파라메터들의 물리적 중요성을 설명하는 것에 중점을 둡니다. 우리는 우리를 기반 모델에서 실제 구현으로 데려다 주는 수학에 특별히 신경씁니다; 수학은 구현 확장에 핵심입니다.

     
    이 시스템은 작은 만(cove)이나 섬에서 보여지는 작은 연못에서 바다 범위를 위해 디자인 되어졌습니다. 비록 정확한 물리 시뮬레이션이 아니더라도, 그것은 그럴싸하고 유연하고, 역동적인 물을 그려줍니다. 시뮬레이션이 모두 GPU에서 동작하기 때문에 인공지능(AI)나 물리 처리와 CPU 사용율에 대해서 문제가 발생하지 않습니다. 시스템 파라메터들이 물리에 기반하기 때문에, 시행착오를 겪으면 쉽게 스크립트를 작성할 수 있습니다. 컴포넌트 Wave 외에도 시스템을 전체적으로 동적으로 만들면 삶의 수준이 올라갑니다.(Making the system as a whole dynamic—in addition to its component waves—adds an extra level of life.)

     

    1.2 The Sum of Sines Approximation

    우리는 2개의 표면 시뮬레이션을 작동시킵니다: 하나는 표면 메시의 기하학적 파동 그리고 하나는 메시에서의 노멀맵의 잔물결 입니다. 두 시뮬레이션은 근본적으로 같습니다. 물 표면의 높이는 간단한 주기 Wave들의 합으로 표현됩니다. 우리는 Sine 함수들의 합산으로 시작하여 더 흥미로운 파형으로 이동합니다.

     
    Sine의 합은 모든 지점의 물의 높이와 표면 방향을 설명하는 연속 함수를 제공합니다. 메시를 연속적 수면과 그것의 테셀레이션 제한에 맞추면서, 버택스 처리중에 우리는 각 버택스의 가로 점들을 기반으로 함수를 샘플링합니다. 지오메트리의 해상도 이하에서, 우리는 텍스쳐 공간으로 이 테크닉 계속해서 적용합니다. 우리는 렌더 타겟 텍스쳐로의 렌더링에 사용하는 간단한 픽셀 쉐이더 연산을 통해서 Sine 근사의 합의 Normal들을 샘플링하여 표면에 대한 Normal map을 생성합니다. 각 frame에 대한 우리의 Normal map을 렌더링하는 것은 우리가 Sine wave의 제한된 세트가 독립적으로 움직이도록 해줍니다. 그리고 그것은 렌더링의 현실감을 크게 향상 시킵니다.

     

    실제로, 우리의 물 텍스쳐에서 잔잔한 Wave는 우리의 현실적인 시뮬레이션 주도합니다. 우리의 Wave 표면의 기하학적 파동은 텍스쳐로 제시된 것에 비해서 더 미묘한 Framework를 제공합니다. 따라서, 우리는 기하학적 Wave나 텍스쳐 Wave 를 선택하는 기준이 서로 다릅니다.

     

    1.2.1 Selecting the Waves

    우리는 각각의 Wave를 정의하기 위해서 파라메터 세트가 필요합니다. 그림 1-2에서 보는 것 처럼, 파라메터는 아래와 같습니다:

    그림 1-2  The Parameters of a Single Wave Function

     

    • 파장(Wavelength) (L): 월드공간에서 두 Wave 사이의 마루에서 마루 까지의 거리. 파장 L은 빈도 w = 2π/L와 관련있습니다.
    • 진폭(Amplitude) (A): 물의 표면에서 Wave 마루까지의 높이.
    • 속도(Speed) (S): 마루가 초당 전진하는 거리. 속도를 phase-constant φ = S x 2π/L 로 표현하는 것이 편합니다.
    • 방향(Direction) (D): Wave의 마루가 이동하는 앞쪽과 수직인 수평 벡터

     

    그리고 나서, 수평 위치 (x, y)와 시간 (t)의 함수에 따른 각 Wave의 상태는 아래와 같이 정의됩니다:

    Equation 1

     

    그리고 모든 Wave i에 대한 총 표면은 아래와 같습니다:

    Equation 2

     

     

    장면의 동적인 변화를 제공하기 위해서, 우리는 제약조건 내에서 랜덤으로 Wave 파라메터들을 생성해 낼 것입니다. 시간이 지남에 다라, 우리는 하나의 Wave가 지속적으로 페이드 아웃 하고나서 다른 파라메터의 세트로 다시 페이드 인 합니다. 밝혀진 것 처럼, 이러한 파라메터들은 독립적입니다. 납득할만한 방법으로 조합하는 각 웨이브에 대한 파라메터의 전체 세트를 생성하는데는 주의를 기울여야만 합니다.

     

    1.2.2 Normals and Tangents

    우리는 표면에 대한 Explicit function(양함수)를 가지고 있기 때문에 finite-differencing 기술에 의존하기 보다, 우리는 주어진 위치에서 표면의 방향을 바로 계산할 수 있습니다. 우리의 binormal B 와 tangent T 벡터들은 x 와 y 방향 각각에 대한 Partial derivatives(편도함수, 편미분)입니다. 2D 수평면에서 특정 (x, y)에 대해서, 표면위의 3D 점 P는 아래와 같습니다:

    Equation 3

     

    x방향의 편도함수 입니다:

    Equation 4a

     

     

     

    Equation 4b

     

    비슷하게, Tangent 벡터 입니다:

    Equation 5a

     

     

     

    Equation 5b

     

    노멀은 Binormal 과 Tangent의 외적으로 얻어집니다:

    Equation 6a

     

     

     

    Equation 6b

     

    우리의 함수 H의 부분을 입력하기 전에, Equation 3-6의 공식이 얼마나 편리한지 주목해주세요. 두 편도함수들의 평가는 우리에게 tangent-space 기저의 9개의 컴포넌트를 줍니다. 이것이 우리가 height field를 우리의 표면을 근사하는데 사용한 직접적인 이유입니다. 그것은, P(x, y).x = x 와 P(x, y).y = y, 그리고 그것은 편도함수에서 0 그리고 1 이 됩니다. 그것은 height field 에서만 유효하지만, 우리가 선택한 특정 함수 H(x, y, t)에 대하여 일반적입니다.

     

    섹션 1.2.1에서 설명한 height function의 경우, 편도함수들은 계산에 특히 편리합니다. 왜냐하면 모든 Wave i 에 대해, 합의 미분은 미분의 합이기 때문입니다:

    Equation 7

     

    Sine Waves를 직접 더하여 생성된 Waves에 대한 공통적인 불만은 "roll"이 너무 많다는 것입니다, 그것은 실제 파도는 더 날카로운 봉오리와 더 넓을 골짜기를 가집니다. 결과적으로, 완전히 컨트롤 가능한 사인함수의 간단한 변형이 이 효과를 줍니다. 우리의 Sine 함수를 음수가 아니도록 하고 지수 k로 올립니다. 그 함수와 그것의 편도함수는 다음과 같습니다:

    Equation 8a

     

     

    Equation 8b

     

    그림 1-3은 상수 k 승의 함수로 만들어진 Wave 모양을 보여줍니다. 이것은 우리가 우리의 텍스쳐 wave에 실제로 사용하는 함수입니다, 그러나 간결함을 위해, 우리는 계속해서 Sine의 합으로 간단히 Wave를 표현합니다, 그리고 우리는 근본적인 Wave 모양의 변화를 설명해야만 하는 점을 알아둬야 합니다.

     

    그림 1-3  Various Wave Shapes

     

    1.2.3 Geometric Waves

    우리는 우리 스스로 4개의 기하학적 Waves로 제한합니다. 더 추가하는 것들은 새로운 개념이 필요없습니다, 그냥 같은 버택스 쉐이더의 더 많은 명령어들과 상수가 필요합니다.

     

    방향성 혹은 원형(Directional or Circular)

    우리는 그림 1-4 처럼 원형이나 방향성 Wave를 선택할 수있습니다. 방향성 wave는 약간 더 벅택스 쉐이더 명령어를 더 요구합니다, 그러나 선택은 시뮬레이션되는 장면에 따라 달라집니다.

     

    그림 1-4  Directional and Circular Waves

     

    방향성 Wave는, Equation 1의 각각의 Di 은 Wave의  수명동안 일정합니다. 원형 Wave는, 각 버택스에서의 방향을 구해야만 하며, 그 방향은 wave의 중심인 Ci 부터 버택스 까지의 간단히 정규화된 벡터입니다:

     

     

    넓은 바다에서는, 방향성 wave가 종종 선호됩니다, 왜냐하면 그들은 바람 주도의 모델에 더 좋기 때문입니다. 작은 물 웅덩이에서의 Wave는 바람에 의한 것이 아닙니다(폭포에 기반으로 하는 것 같은), 원형 wave가 더 선호됩니다. 원형 wave는 간섭 패턴이 절대로 반복되지 않는 좋은 특성이 있습니다. 두가지 Wave 종류의 구현은 꽤 비슷합니다. 방향성 wave에서, Wave의 중심은 특정 유한한 범위로 부터 무작위로 얻어집니다 (폭포가 물 표면을 때리는 선과 같은). 이 토론의 남은 부분은 방향성 wave에 집중합니다.

     

    Gerstner Waves

    효율적인 시뮬레이션을 위해서, 우리는 Wave의 가파름을 조정할 필요가 있습니다. 이전에 논의한 것처럼, Sine wave는 둥글게 보입니다 - 아마도 고요하고 pastoral 연못에서 정확히 우리가 원하는 것일 것입니다. 그러나 거친 바다에서는, 우리는 더 뾰족한 꼭대기와 더 넓은 골(trough)를 형성할 필요가 있습니다. 우리는 Equation 8a 와 8b가 원하는 모양을 만들 수 있기 때문에 사용할 수 있을 것입니다, 그렇지만 우리는 Gerstner wave와 연관된 것을 대신 선택합니다. Gerstner wave 함수는 물리에 기반하여 바다를 모델링하기 위해서 컴퓨터 그래픽스보다 오래전에 개발되었습니다. 따라서, Gerstner wave는 표면의 미묘한 움직임에 기여합니다. 이 표면의 미묘한 움직임은 명백하진 않고 꽤 설득력 있습니다. (자세한 것은 Teseendorf 2001을 보세요). 우리는 여기서 Gerstner wave를 선택하는 이유가 그들이 종종 간과되는 특성을 가지기 때문입니다: 그들은 각각의 마루로 향하여 이동하는 버택들에 의해서 더 날카로운 마루를 구성합니다. 표면에서 Wave의 마루가 가장 날카롭다는(즉, 가장 높은 빈도) 특징 때문에, 정확히 그곳에 우리의 버택스들이 집중되길 바라는 곳입니다. 그림 1.5 처럼.

     

    그림1-5  Gerstner Waves

     

     

    Gerstner wave 함수는 아래와 같습니다:

    Equation 9

     

    여기서 Qi는 Wave의 가파름을 조정하는 파라메터입니다. 단일 Wave i에 대해서, 0의 Qi는 일반적인 rolling sine wave를 줍니다, 그리고 Qi = 1/(wi * Ai)는 날카로운 마루를 줍니다. Qi의 더 큰 값은 피해야만 합니다, 왜냐하면 그들은 Wave의 마루의 위쪽을 형성하기위해서 반복을 유발할 것이기 때문입니다. 실제로, 우리는 아티스트를 위해서 0에서 1 사이 범위인 Q를 "가파름" 파라메터로 사용할 수 있습니다, 그리고 Qi = Q/(wi * Ai x numWaves)를 사용하여 완전히 부드러운 Wave에서 날카로운 Wave까지 우리가 생성할 수 있도록 합니다.

     

    Equation 3 과 9의 유일한 차이점은 버택스들의 측면 이동입니다. 높이는 같습니다. 이것은 우리가 더 이상 엄격한 height 함수가 없다는 의미입니다. 그것은,

     

     

    그러나, 함수는 여전히 쉽게 구별가능하며 몇몇 텀을 제거할 수있는 편리함이 있습니다. 독자들의 연습을 위한 유도과정을 아끼기 위해서, 우리는 탄젠트 공간의 기저벡터들을 아래와 같이 볼 수 있습니다:

    Equation 10

     

     

    Equation 11

     

     

    Equation 12

     

     

    여기서:

     

    이 방정식들은 Equations 4b, 5b 그리고 6b 처럼 깔끔하지 않습니다만 그들은 꽤 계산하기에 효율적입니다.

     

    Normal의 Z 컴포넌트를 더 자세히 보면 Wave의 마루에서 반복(loop)들을 구성하는 문맥이 흥미롭습니다. Tessendorf (2001)가 그의 "choppiness" 효과를 유체 역학의 Navier-Stokes 설명과 "Lie Transform Technique"로 부터 유도하지만 최종 결과는 주파수 영역(frequency domain)에서의 Gerstner wave 표현의 변종입니다. 주파수 영역에서, Wave 꼭대기에서 반복하는 것은 피하고 감지될 수 있습니다, 그러나 공간영역(Spatial domain)에서는, 우리는 어떤 일이 일어나는지 확실히 볼 수 있습니다. Qi x wi x Ai의 합이 1보다 더 클때, 우리의 Normal의 z 컴포넌트는 꼭대에서 음수가 될 수 있습니다. 우리의 Wave는 스스로 반복하기 때문입니다. 우리가 이 합이 항상 1보다 작거나 같도록 Qi을 선택하는 한, 우리는 날카로운 꼭대기를 구성합니다. 그러나 결코 루프를 만들진 않습니다.   

     

    Wavelength and Speed

    우리는 적절한 파장을 선택하는 것으로 시작합니다. 실제 세계의 분포를 따르기 보다는, 우리는 감당할 수 있는 몇개의 파도의 효과를 극대화하길 원합니다. 비슷한 길이의 Wave의 중첩이 물 표면의 역동성을 강조합니다. 그래서 우리는 중간 파장을 선택하고 절반과 두배 사이의 랜덤 파장을 생성합니다. 중간 파장은 제작하는 과정에서 스크립팅 되어집니다, 그리고 그것은 시간에 따라 변할 수 있습니다. 예를들어, Wave는 맑고, 고요한 때보다 폭풍이 치는 동안 더 클 수 있습니다. 주의할 점은 우리가 활상화된 Wave 의 파장은 변경 할 수 없다는 점입니다. 비록 이것은 점진적으로 변화한다 하더라도, Wave의 마루는 원점을 향해 접근하거나 더 멀어질 수 있습니다, 다양한 부자연 스러운 점이 나타납니다. 그러므로, 우리는 현재 평균 파장을 변화합니다, 그리고 Wave가 시간이 지나 소멸하면, 그들은 다시 새로운 길이를 기반으로 다시 생성됩니다. 방향은 동일합니다.

     

    파장이 주어지면, 우리는 쉽게 표면에서 진행되는 속도를 계산할 수 있습니다. 물에 대한 분산관계(Tessendorf 2001), 최고차 항이 무시된 채로, 다음과 같이 주어집니다:

     

    Equation 13

     

    여기서 w는 빈도(frequency) 그리고 g는 우리가 사용하는 것과 일치하는 (9.8 m/s^2 같은) 중력 상수입니다, 그리고 L은 Wave에서 마루에서 마루까지의 길이입니다.

     

    Amplitude

    진폭을 어떻게 처리할지는 개인적 의견에 따릅니다. 비록 파장과 현재 날씨 조건들의 함수 처럼 Wave의 진폭 유도도 존재하지만, 우리는 상수를 비율을(혹은 스크립트된 것) 사용합니다, 제작 시간에 정해집니다. 더 정확하게, 중간 파장을 따라서, 아티스트는 중간 진폭을 정합니다. 특정 크기의 Wave에 대해서, 파장에 대한 그것의 진폭의 비율은 중간 파장에 대한 중간 진폭의 비율과 일치할 것입니다.

     

    Direction

    Wave가 이동하는 방향은 다른 파라메터들과 완전히 독립적입니다, 그래서 우리는 각각의 특정 기준을 기반으로 wave의 방향을 선택하는게 자유롭습니다. 이전에 언급한 것 처럼, 우리는 대략 바람 방향인 상수 벡터로 시작합니다. 그리고나서 상수 바람방향의 각도내에서 랜덤하게 선택합니다. 상수 각도는 컨텐츠 생성 시간에 정해집니다, 혹은 스크립트 됩니다.

     

    1.2.4 Texture Waves

    우리의 텍스처로 합산하여 저장될 Wave들은 그들의 버택스가 같기 때문에 같은 파라미터를 가지지만 다른 제약들도 가집니다. 먼저, 텍스쳐에서는 주파수의 넓은 스펙트럼을 캡쳐하는 것이 더 중요합니다. 둘째로, 패턴들은 텍스쳐에서 자연스러운 모습의 물결을 깨면서 형성되는 경향이 있습니다. 셋째로, 주어진 파장에 대한 특정 Wave 방향만 전체 텍스쳐의 타일링을 보존 할 것입니다. 또한, 주의 점은 여기서 모든 양은 월드공간의 거리가 아니라 텍셀 단위 입니다.

     

    우리는 현재 약 15 Wave의 다양한 주파수와 방향을 2~4 패스를 거쳐 사용합니다. 4 패스는 아마 과도하다고 생각할 수 있습니다만 그들은 메인 프레임 버퍼가 아닌 256x256 렌더타겟에 들어갑니다. 실제로는, 노멀맵의 생성의 fill rate 로 부터의 hit는 무시할만 합니다.

     

    Wavelength and Speed

    다시, 우리는 파장을 선택하면서 시작합니다. 우리는 텍스쳐크기로 유지할 파장의 범위가 제한됩니다. 명백히, Sine wave이 만약 텍스쳐가 타일링 되면, 텍스처는 적어도 한번 반복되야만 합니다. TEXSIZE를 최대 파장으로 선택합니다, 그리고 TEXSIZE는 타겟 텍스쳐의 차원입니다. Wave는 파장이 4텍셀에 근접 하므로 톱니 모양으로 감쇄할 것입니다, 그래서 우리는 최소 파장을 4 텍셀로 제한합니다. 또한 더 긴 파장은 이미 기하학적 파동에 의해 근사되어졌습니다, 그래서 우리은 더 짧은 파장을 선택하는 것을 선호합니다. 우리는 보통 4와 32 텍셀 사이의 파장을 선택합니다. 매 50 피트 마다 범프맵을 타일링하면, 32 텍셀의 파장은 6피트에 해당합니다. 이것은 약 4 피트 정도 위방향으로 범위, 그리고 텍스처 파장의 아래 방향으로 약 6 피트 정도 범위의 기하학적 파장을 약간 겹치면서 만들어 줍니다.

     
    Wave의 속도 계산은 기하학적 형태와 일치합니다. Equation 8a와 8b의 지수는 Wave 마루의 날카로움을 컨트롤 합니다.

     

    Amplitude and Precision

    우리는 파장에 대한 진폭을 일정한 비율 kAmpOverLen로 유지하면서, 각 Wave의 진폭을 우리가 기하학적 Wave에서 했던 것 처럼 결정합니다. 이것은 흥미로운 최적화로 이어집니다.

     
    우리는 여기서 Height 함수와 연관되지 않았다는 것을 기억해야 합니다; 우리는 Normal map 만 만들고 있습니다. 우리의 룩업 텍스처는 cos(2π u)를 포함합니다, 여기서 u는 0에서 1까지의 범위인 텍스쳐 좌표입니다. 우리는 raw cosine 값을 노멀에 저장하기 보다 룩업 텍스쳐에 저장합니다. 그 이유는 노멀을 저장하고 텍스쳐로 그들을 회전하려는 것 보다 cosine을 회전된 노멀 값으로 변환 하는 것이 실제로 더 쉽기 때문입니다.

    우리는 우리의 룩업 텍스쳐를 렌더타겟에 렌더링 하므로써 Sine의 합의 노멀을 평가합니다. Equation 7을 u-v 공간에서 표현하는 것은 아래와 같습니다:

     

    Equation 14

     

    여기수 u와 v는 렌더타겟 전체에 대해 0~1 값으로 달라집니다. 우리는 내부 텀을 버택스 쉐이더에서 계산합니다,

    , 픽셀 쉐이더에 텍스처 룩업을 위해서 u 좌표를 결과로 전달합니다. 외부 텀은,

    그리고

     , 상수로 전달 됩니다. 픽셀 쉐이더의 결과는 Wave 당 텍스처 룩업의 상수 시간입니다. 우리는 Equation 8a의 날카로운 마루의 wave 함수를 사용하려면, 우리는 간단히 우리의 룩업 테이블을 아래와 같이 채워야 합니다:

     

    cos(2π u) 대신에 외부 텀으로 전달합니다.

     

    여기서 룩업 테이블을 사용하는 것은 속도와 유연함을 제공합니다. 그러나 프로세서 속도와 메모리 접근 시간 사이의 상대적 증가 비율은 CPU 사이드의 룩업 테이블을 선호하지 않도록 하였습니다, 우리는 같은 발전을 GPU에서 예측할 수 있습니다. 기대하는 것은, 우리는 룩업 텍스처를 직접 수학적 계산 보다 더 차별적일 수 있을 거라 예측합니다. 특히, 룩업테이블을 사용하므로써, 우리는 Wave의 날카로움을 변경하기 위해서 룩업 테이블을 다시 만들어야만 합니다.

     
    버택스 쉐이더에서 기하학적 노멀의 조합하는 접근법과 다르게, 텍스처의 Wave 생성에서 우리는 정밀도에 매우 연관되어있습니다. 각각의 출력 노멀 컴포넌트는 biased, signed, 8비트 정밀도의 fixed-point로 표현되어야만 합니다. 만약 표면이 매우 가파르면, x 나 y 컴포넌트는 z컴포넌트 보다 클 것이고 1이 될 것 입니다. 만약 표면이 항상 얕다면, x와 y 컴포넌트는 0에 가까워 질것이고 양자화(quantization) 에러에 고통받을 것입니다. 이 작업에서, 우리는 후자의 경우를 예상합니다. 만약 우리가 x, y 컴포넌트에 대한 값에 타이트한 바운드를 만들 수 있다면, 우리는 가능한한 최대의 정밀도를 위해 텍스처의 노멀을 텍스쳐에서 “scale” 할 수 있습니다, 그리고나서 “un-scale”하여 그들을 사용합니다.

     
    생성된 노멀의 x 컴포넌트를 검사하면서, 우리는 먼저 cosine 함수와 방향벡터의 x 컴포넌트 범위가 [-1..1] 구간에 있음을 확인합니다. 빈도와 진폭의 곱은 문제가 있습니다, 왜냐하면 빈도와 진폭은 Wave마다 서로 다르기 때문입니다.

     

    파장에 대한 빈도를 사용하여 Equation 7을 표현하은 것은, 아래와 같습니다:

     

    높이는 더 큰 진폭의 wave에 지배되어지는 반면, 표면의 방향은 진폭과 파장의 비율이 더 높은 wave에 지배되어집니다.


    우리는 먼저 이 결과를 진폭과 파장에 대한 상수 비율을 모든 wave에 사용하는데 정당화 하기 위해서 사용합니다, wave의 수가 제한되어 있기 때문에, 우리는 더 작은 비율인 것을 제거하기러 결정합니다. 둘째로, 상수 비율이기 때문에, 우리의 wave의 x와 y 컴포넌트는 kAmpOverLen x 2π 보다 작은 절대 값으로 제한된다고 알고있습니다, 그리고 모든 것은 numWaves x kAmpOverLen x 2π 로 제한됩니다. 그래서 시뮬레이 중 해상도를 유지하려면, 우리는 누적합니다:

     

     그리고 우리가 그들을 사용할 때, numWaves x 2π x kAmpOverLen 로 스케일 합니다.

     

    Direction and Tiling

    만약 타일링이 없이 사용할 만큼 렌더타겟의 해상도가 충분하다면, 우리는 임의의 Sine 함수를 누적하여 그것으로 넣을 수 있습니다. 실제로, 우리는 임의의 노멀맵을 누적해서 그것에 넣을 수 있습니다. 예를들어, 우리는 장면안에서 캐릭터의 움직임을 따라 격동적인 왜곡을 중첩 할 것 입니다. 또는 우리는 단일 sine wave보다 더 복잡한 함수로 시작하여 더 적은 wave 함수의 누적으로 더 복잡도가 높은 wave를 얻을 수 있습니다. 기억할 것은 이 기술의 힘은 wave의 상대적인 움직임에 있다는 것 입니다. 한 단위로 움직이는 복잡한 wave 패턴은 더 간단한 wave의 독립적인 움직임에 비해 덜 현실적이고 덜 강력합니다.

     
    이러한 추가사항들은 상대적으로 간단합니다. 그러나 렌더타겟을 타일링 하은 것은 우리가 누적한 wave 함수에 약간의 제약을 부과합니다. 특히, 원형 wave의 주요 매력은 반복된 패턴을 만들지 않는 점 입니다. 만약 우리가 텍스쳐를 타일링 하면, 우리은 wave 반복 형태가 필요합니다, 그래서 우리는 우리 스스로 방향성 wave로 제한합니다.

     
    명백히, 텍스쳐를 타일링 하는 것은 텍스쳐가 정수 숫자 배수로 반복 되는 경우에만 그것 자체를 타일릴 시킵니다. 또한, 타일링 되는 주어진 파장의 sine wave에 다해서, 텍스쳐의 특정 회전만 여전히 타일링 될것 입니다. 덜 명확한 것은, 그러나 거의 사실과 같음, 만약 우리가 추가한 각각의 회전된 sine 함수가 타일링 되면, 이러한 sine 함수의 합 또한 타일링 될 것 입니다.

     
    우리는 텍스쳐 변환을 통해서 sine 함수를 회전하고 스케일 하기 때문에, 우리는 타일링에 대해서 두가지 상태를 텍스처 변환의 스케일되고 회전된 요소들이 정수인지 확인하여 보장할 수 있습니다. 우리는 그리고나서 위상 컴포넌트를 변환의 이동으로 추가하므로써 wave에 이동 시킵니다. 주의할 점은 텍스쳐는 실제로 1D이므로, 우리는 변환된 u 좌표에만 연관되어져야 합니다.

     

    1.3 Authoring

    우리는 이 섹션에서 짧게 어떻게 물 시스템이 오프라인에 배치되고 모델링 되는지 논의했습니다. 물 mesh의 모델링을 통해서, 컨텐츠 제작자는 시뮬레이션을 버텍스 레벨에서 조정합니다. 그림 1-6을 보세요.

     

    그림 1-6 Ocean and Pond Water

     
    우리의 구현에서, 메시 데이터는 메시의 테셀레이션, 메시에서 각 버택스의 수평 위치, 버택스 아래의 바다의 수직 위치, 그리고 RGBA 컬러로 제한됩니다. 텍스처 좌표는 명시적으로 기술되거나 즉석에서 생성될 것입니다. 그림 1-7을 보세요.

     

    그림 1-7 The User Interface of the 3ds max Authoring Tool

     

    먼저, 우리는 버택에서 물의 깊이를 입력 파라메터로 이용하는 방법을 이야기 해봅니다. 그리고 그것으로 부터 쉐이더는 물이 해안과 만나는 섬세한 영역에서 자동으로 수정될 수 있습니다. 우리는 또한 특히 유용하다고 증명된 몇몇 버택스 수준의 시스템을 다룹니다. 앨리어싱 artifact를 방지하기 위해서, 우리는 메시의 샘플링 빈도가 충분하지 않은 wave를 자동으로 걸러냅니다. 최종적으로, 우리는 암묵적으로 위치에 따라 planar 매핑에 기반하는 것이 아니라 텍스처 매핑이 컨텐츠 생성시건에 명확히 명세될 때에 필요한 추가 입력 데이터에 대해 설명합니다.

    1.3.1 Using Depth

    물의 높이가 계산되어 질 것이므로, 버택스 위치의 z 컴포넌트는 아마 사용되지 않을 것입니다. 우리는 이것을 버택스를 압축하는 이득을 볼 수 있습니다, 그러나 우리는 물의 깊이를 z 컴포넌트에 저장하기로 선택합니다. 더 정확히는, 우리는 바다의 바닥의 높이를 버택스의 z 컴포넌트에 넣습니다, 상수로 수면 높이 테이블을 전달, 그리고 물을 깊이는 빼기로 얻을 수 있습니다. 다시한번, 이것은 상수 높이인 물 테이블을 사용합니다. 강이 언덕 아래로 흘러가는 것을 모델링 하기위해서, 우리는 각 버택스의 깊이 뿐만 아니라 명확한 3D 위치가 필요합니다. 그런 경우에, 깊이는 물 표면에서 강바닥으로 간단한 레이 케스트를 사용하여 오프라인에서 계산되어 질 것입니다, 혹은 그것은 명시적으로 버택스 컬러로 작성 되어질 수 있습니다, 그러나 측정 상황에서, 깊이는 추가적인 버택스 데이터로 전달되야만 할 수 있습니다.

     
    우리는 물의 깊이를 물의 불투명도를 조정, 반사의 강도, 그리고 기하학적 wave의 진폭에 사용합니다. 예를들어서, 시스템을 위한 한 쌍의 입력 파라메터는 물의 투명한 깊이와 최대 불투명한 지점의 깊이 입니다. 이것은 해안에서 0에서 3피트로 깊어질 때, 물이 투명에서 최대 불투명으로 가게 할 것입니다. 이것은 앝은 물의 밝기가 깊은 물의 밝기보다 덜 밝기 때문에 아주 조잡한 모델링입니다. 물의 깊이로 사용가능한 것은 빛의 투과 효과를 더 정교하게 모델링 할 수 있게 해줍니다.

     
    깊이를 기반으로 한 기하학적 wave의 진폭의 감쇄는 물리적 모델 만큼이나 실용적 문제입니다. 물 메시가 물 표면을 만나 wave가 감쇄하는 것은 메시가 만나는 가파른 제방에 물 버택스가 고정(“fixed”) 되게 합니다. 그것은 또한 얕은 해안으로 오는 wave가 점진적으로 감소하게 합니다. 우리는 우리의 버택스가 절대로 입력 높이 보다 아래로 떨어지지 않도록 제한하기 때문에, wave가 수면 약간 위인 0으로 감쇄하는 것은 wave가 해안위에 겹치도록 해주면서 얼마나 멀리 갈 수 있을지를 있는지 컨트롤 하게 해줍니다

     

    1.3.2 Overrides

    대부분은, 시스템이 “그냥 작동합니다”, 모든 버택스에 동일하게 처리합니다. 그러나 버택스 기반 시스템 동작을 컨텐츠 제작자가 오버라이드 하는 특별한 경우가 있습니다. 우리는 이러한 오버라이드를 RGB 버택스 컬러로 오버라이드 하여 저장합니다. 기본값인 흰색을 그대로 두고, 이 오버라이드는 모든 컨트롤을 시뮬레이션에 전달합니다. 채널을 0으로 낮추면 효과가 조정됩니다.

     
    레드 컴포넌트는 전체 투명도를 지배합니다. 레드 컴포넌트가 0 되면 완전히 투명해집니다. 초록색은 표면에서의 반사 강도를 조정합키다, 초록 채널이 0리면 물의 표면은 거칩니다. 파란색 채널은 불투명 감쇄를 바라보는 각도를 기반으로 제한합니다, 그리고 이것은 프레스넬 텀에 영향을 줍니다. 이런 컬러들 중 하나를 다르게 사용하는 것은 계산된 픽셀당 노멀의 수평 컴포넌트 조정 하는 것입니다. 이것은 물의 몇몇 영역이 다른 곳 보다 거칠게 해줍니다. 만에서 흔이 볼 수 있는 효과 입니다.

     

    1.3.3 Edge-Length Filtering

    만약 당신이 신호처리 이론에 이미 익숙하다면, 당신은 우리의 메시 파동에 사용 할 수 있는 가장 짧은 파장이 메시를 얼마나 미세하게 테셀레이션 하느냐에 따라 달린 것이라는 것을 쉽게 알아차릴 수 있습니다. Nyquist 이론으로 부터, 우리는 우리가 사용하는 가장 짧은 파장의 반 이하로 분리되어질 버택스들이 필요합니다. 만약 명확하게 보이지 않는다면, 그림 1-8을 참고하세요, 그것은 개념에 대한 직관적인, 엄격하지 않은, 설명을 해줍니다. 메시의 삼각형의 에지가 우리의 height 함수의 높이에 비해서 짧은한, 표면은 좋게 보입니다. 에지의 길이가 우리 함수의 가장짧은 파장의 절반이거나 더 길다면, 우리는 불쾌한 artifacts를 봅니다.

     

     

     

    그림 1-8  Matching Wave Frequencies to Tessellation

     

    합리적이고 일반적인 접근은 우리의 height 함수에서 가장 짧은 파장을 미리 결정하고, 모든 에지가 파장보다 더 짧게 메시를 테셀레이션 하는 것입니다. 이 작업에서 우리는 다른 접근법을 씁니다: 우리는 버택스의 인접한 에지의 길이를 봅니다. 그리고나서 "너무 짧아"서 이웃으로 표현하기 너무 짧은 wave를 제거합니다.

     

    이 기술은 2가지 즉각적인 이점이 있습니다. 먼저, 특정 파장을 원치 않는 artifacts, 메시의 테셀레이션에 관계없이 버택스 프로세싱 유닛에 전달 할 수 있습니다. 이것은 시뮬레이션이 현재 기상조건만을 기반으로 파장을 생성하게 해줍니다. 메시에 파동을 주기에 너무 작은 특정 파장은, 파장이 에지 길이의 4배일때 1에서 파장이 에지 길이의 2배일 때 0이 되는 감쇄값으로 인해 제거됩니다. 둘째로, 메시는 균일하게 테셀레이션 될 필요는 없습니다. 더 많은 삼각형들이 관심영역에 할당 될 것입니다. 덜 중요하고, 더 적은 삼각형과 긴 에지 영역은 더 평평해집니다, 그러나 불쾌한 artifact는 없을 것입니다. 예를들어 물을 수평으로 확장할 때 더 큰 삼각형을 사용하여, 해안 근처에서 강하게 테셀레이션 된 만을 모델링 할 수 있습니다.

     

    1.3.4 Texture Coordinates

    보통 텍스쳐 좌표계는 명세될 필요는 없습니다. 노멀맵의 단일 타일이 다루는 월드 공간의 거리를 명세하는 스케일 값을 기반으로 그들은 쉽게 버택스 위치에서 유도되어집니다. 

     

    그러나 몇몇의 경우 명확한 텍스처 좌표계가 더 유용할 수 있습니다. 예를 들어 구불구불한 강을 따라 물이 흐르는 것입니다. 이 경우에, 명확한 텍스처 좌표계는 범프맵 노멀을 구부러져있는 길을 따라 뒤틀린 텍스쳐 공간에서 월드 공간으로 변환시키기 위해서 탄젠트 벡터와 함께 전달되어야 합니다. 이러한 값은 자동적으로 텍스쳐 좌표계에 관한 위치의 편도함수(편미분) 으로 부터 오프라인에서 계산되어집니다. 그리고 그것은 범프맵의 표준입니다. "Per-Pixel Lighting" in Engel 2002 섹션은 탄젠트 공간 기반의 실용적인 설명을 DirectX를 사용합니다.

    1.4 Runtime Processing

    고수준의 버택스와 픽셀 쉐이더에서 처하는 것을 고민해봅시다. 자세한 내용은 첨부된 소스코드를 참고하세요. 우리 뒤의 이전 섹션으로 부터의 설명에서, 처리는 꽤 간단합니다. 오직 단 하나의 미묘한 이슈가 남아있습니다.

     

    역동성을 가진, 파동치는 기하학적 표면, 그리고 상호작용하는 wave의 복잡한 노멀맵, 우리는 그 두가지를 묶기 위해서 적절한 범프-환경 매핑 파라메터를 생성하기만 하면 됩니다. 이러한 파라메터는 우리의 노멀을 텍스쳐 공간에서 월드 공간으로 변환시키는 파라메터입니다, 그리고 우리의 표면에서 반사되어 우리의 cubic 환경 맵으로 나가는 Eye 벡터입니다. 우리는 그것들을 먼저 유도하고 버택스와 픽셀 쉐이더를 처리를 살펴봅니다.

     

    1.4.1 Bump-Environment Mapping Parameters

     

    Tangent-Space Basis Vectors

    우리는 공간 기저 벡터를 우리의 물 표면 함수의 편도함수로 부터 계산할 수 있습니다. Equations 10, 11 그리고 12는 Binormal B, Tangent T 그리고 Normal N을 우리에게 줍니다.

     

    우리는 이러한 값을 row-major matrix로 사용하기 위해서 벡터에 쌓습니다, 그래서 우리의 매트릭스는 이렇게 될 것입니다:

     

    기저 벡터를 얻는 곳을 제외하고, 이것은 범프매핑을 위한 일반적인 변환입니다. 그것은 우리 표면이 물결치는 모양이며, 평평하지 않고, 물결치는 표면 공간으로 부터 월드공간으로 변환하는 것을 설명합니다. 만약 우리의 노멀맵에 대한 텍스쳐 좌표계가 암시적이라면 - 그것은, 버택스 위치에서 유도되어집니다 - 그리고나서 우리는 텍스쳐 공간과 월드 공간 사이에는 회전이 없다고 가정할 수 있습니다, 그래서 우리는 그렇게 했습니다. 만약 우리가 명시적 텍스쳐 좌표를 사용했다면, 우리는 텍스쳐가 강을 따라 뒤틀리기 때문에 회전을 고려해야만 합니다.

     

    오프라인에서 계산되어진 ðP/ðu 와 ðP/ðv 을 갖고, 우리는 이것을 우리의 텍스쳐공간 노멀을 표면 공간 노멀로 변환시키는 회전 매트릭스를 구성하기 위해서 사용합니다.

     

     

    이것은 분명히 수평면에서의 회전입니다, 그리고 그것을 우리는 물 메시를 증감률(Gradient) 계산전에 z = 0으로 축소했기 때문에 예상할 수 있습니다. 더 일반적인 상황인, 기본 표면이 평평하지 않은 경우, 이것은 3x3 매트릭스 일 것입니다. 두 경우 모두, 순서는 중요합니다, 그래서 우리의 연결되어진 매트릭스는 Surf2World x Tex2Surf 입니다.

     

    만약 우리가 노멀의 x,와 y 컴포넌트를 재조정 하고싶다면, 우리는 한가지 마지막 단계를 거쳐야 합니다. 우리는 컴포넌트를 재조정하길 원할 수 있습니다. 왜냐하면 우리는 그들을 노멀맵을 쓸때 정밀도를 최대화하기 위해서 재조정 하기 때문입니다. 혹은 앨리어싱에 대응하기 위해서, 우리는 아마 그들을 카메라에서 부터 거리를 기반으로 재조정을 원할 수도 있습니다. 두 경우에, 앞의 두 변환들 보다 이전에 우리는 원래 노멀 값의 x와 y 컴포넌트에 재조정을 적용하길 원할 것입니다. 그런 뒤, s를 유니폼 스케일 요소라고 가정하면서, 우리의 스케일 매트릭스와 최종 변환은 아래와 같습니다:



    Eye Vector

    우리는 일반적으로 버택스의 eye-공간의 위치를 환경맵에 대한 조회에 기반이 되는 Eye 벡터로 사용합니다. 이것은 무한이 멀리 떨어진 것 같은 환경맵에서 장면을 효과적으로 다룹니다.

     

    만약 물에서 반사되어지는 모든 것이 거의 무한이 떨어져있다면 - 예를들어, 스카이 돔 - 그러면 이것은 완벽하게 근사됩니다. 그러나, 더 작은 바다의 경우, 반사가 반대쪽 해변의 오브젝트를 보여주는 곳에서는 우리는 더 나은것을 원합니다.

     

    무한한 거리 보다는, 우리는 반사되어지는 특징이 우리의 웅덩이의 중심에서 균일한 거리이길 가정하고 싶습니다. 우리는 환경맵을 우리의 웅덩이의 중심에서 같은 반지름의 구에 투영시킬 것입니다. Brennan 2002 는 아주 영리하고 효과적인 근사로 이것을 설명합니다. 우리는 대체 접근 법을 제안합니다.

     

    그림 1-9는 해결책과 문제에 대해서 직관적인 느낌을 줍니다. 점 C에서 부터 생성된 환경맵이 주어지면, 카메라는 이제 점 E에서 버택스의 점 P를 바라보고 있습니다. 우리의 Eye 벡터가 E에서 P를 지나고 환경맵에서 A에 있는 오브젝트를 보길 원합니다. 그러나 Eye 벡터는 실제로 환경맵이 생성되어진 점으로 부터 상대적입니다, 그래서 우리는 점 B에서 환경맵을 샘플링 합니다.

     

     

    그림 1-9  Correction of the Eye Vector

     

     

    우리는 C에서 A로 이동시킬 Eye 벡터를 계산하고 싶습니다. 우리의 원래 eye vector와 교차하는 점으로 A를 찾을 수 있습니다. 그런 뒤 교정되어진 eye 벡터는 A - C 입니다. A는 반지름 r 의 구위에 있기 때문에,  A = E + (P - E)t, 우리는 다음을 가집니다:

     

     

    이것은 다음으로 확장됩니다:

     

     

    우리는 이차방정식을 t에 대해서 풉니다, 아래와 같이 주어집니다:

     

     

     

    여기서 우리는 몇가지를 교체합니다:

     

     

     

    교체하고 더 작은 루트를 버리면 아래와 같습니다:

     

     

     

    2를 소거하고 D^2 = 1 로 합니다 (정규화 입니다), 다음과 같습니다:

     

     

    그리고

     

     

    우리는 이미 D를 가집니다, 정규화된 eye vector, 우리가 바라보는 방향을 기반으로 물의 불투명도를 감쇄하는데 그것을 사용하기 때문입니다. FG는 상수입니다. 그래서 t와 우리의 보정된 eye 벡터를 계산하면, 비록 그것은 보기좋게 시작하지 않지만, 오직 5개의 산술 연산만 요구합니다. 이것은 Fernando 와 Kilgard 2003 에서 만든 강력한 장점을 강조합니다, 즉, 메시에서 쉐이더 상수로  넘기는 상수를 줄이는 것은 극적이고 놀라운 최적화를 쉐이더 코드에서 가져올 수 있습니다.

     

    왜냐하면 우리는 본질적으로 반직선과 구에 충돌시켰기 때문에, 이 방법은 만약 레이가 구와 충돌하지 않는다면 명백히 실패할 것입니다. 이 가능성은 특별히 우리와 관련 없습니다. 만약 Eye 위치와 버택스 위치가 구의 안에 놓여있다면 항상 실근일 것입니다, 그리고 구가 바다의 주변 풍경을 둘러싸고 있기 때문에, 그것은 물의 버택스가 구안에 놓여있도록 제한하기에 안전합니다.

     

    주의할 점은 바다에 반사되어진 주변환경은 구로의 매핑에 의해서 잘 근사되어지지 않습니다, 혹은 주변환경이 정적 환경맵으로 캡쳐하기에 너무 역동적인 경우, Vlachos et al. 2002에서 설명한 투영 방법이 선호될 수 있습니다.

     

    1.4.2 Vertex and Pixel Processing

    우리는 4개의 기하학적 Wave의 각각에 대한 Sine과 Cosine 함수를 평가하는 것으로 시작합니다.

     

    그들을 더하기 전에, 우리는 이 버택스에서 물의 깊을 얻기위해 우리의 Water-table height 상수에서 우리의 입력 버택스 Z를 뺍니다. 깊이는 이 입력 상수 깊이들간의 보간의 어떤 형태로 우리의 첫 wave-height 감쇄 요소를 구성합니다.

     

    우리는 이 버택스의 근처의 최소의 에지 길이를 저장했기 때문에, 우리는 이제 그것을 파장을 기반으로 Wave의 높이를 독립적으로 감쇄하기 위해서 사용합니다. 이 감쇄는 에지의 길이가 파장의 일부만큼 길어지면 제거합니다.

     

    명확한 텍스쳐 좌표계는 그대로 전달되어집니다. 암묵적 좌표계는 간단히 버택스의 x와 y의 위치로 스케일링 합니다. 텍스쳐 공간에서 월드 공간으로 변환하는 것은 섹션 1.4.1에서 설명합니다. 사용된 스케일 값은 입력 상수는 1.2.4 섹션의 서브섹션의 "Amplitude and Precision" 처럼 numWaves x 2π x kAmpOverLen 입니다. 스케일 값은 버택스에서 눈까지 거리가 증가함에 따라서 0이 되는 다른 스케일 요소로 조정됩니다. 먼 거리에서 노멀이 기하학적 표면의 노멀로 축소됩니다. 그리고 그곳에서 노멀맵 텍셀은 픽셀 보다 더 작습니다. Eye 벡터는 범프 환경 매핑을 위해 필요한 마지막  조각으로 계산되어집니다. 

     

    우리 버택스당 2개의 컬러를 냅니다. 첫번째 컬러는 물에 적절한 컬러입니다. 두번째는 물에서 반사되어 나가는 밝기 일 것입니다. 적절한 물의 불투명도는 먼저 깊이 함수로 조정됩니다, 일반적으로 얕은 물에서 더 투명해집니다. 그리고나서 그것은 바라보는 각도를 기반으로 조정됩니다, glancing angle에서 볼때 보다 물은 위에서 직접 볼때 더 투명하기 때문입니다. 픽셀당 프레즈넬 텀은, 다른 더 정교한 효과 처럼, 버택스 레벨에서 감쇄를 계산하기 보다 View 벡터를 픽셀쉐이더에 전달하여 계산할 수 있을 것입니다. 반사 컬러는 역시 깊이와 바라보는 각도에 의해서 조정됩니다만 반사가 투명하게 되는 시기와 방법에 대해서 분리된 컨트롤을 제공하기 위해서 독립적으로 조정합니다.

     

    픽셀 처리 단계에서, 작은 일들이 남아있습니다. 간단한 범프 룩업을 환경맵으로 하는 것은 반사 컬러를 줍니다. 우리는 현재 Cubic 환경맵을 보고 있지만, 그러나 Vlachos et al. 2002에서 설명된 투영된 평면 환경 맵은 많은 상황에서 선호될 수 있습니다. 반사된 컬러는 물의 적절한 색상에 추가하여 조정됩니다. 픽셀이 나오고 프레임 버퍼에 알파브랜드 됩니다.

     

    1.5 Conclusion

    물 시뮬레이션은 버택스와 픽셀 쉐이더의 문맥에서 흥미로운 주제입니다. 부분적으로 이러한 뚜려한 기술을 cohesive system에 활용하기 때문입니다. 여기서 설명된 작업은 강화된 범프 환경맵과 버택스와 픽셀 쉐이더의 복잡한 함수 평가를 결합합니다. 우리는 이 챕터가 2가지 방식으로 유용했으면 합니다: 첫째로, 자주 임시 시스템으로 생각하는 물리와 수학을 자세히 설명하여서, 우리가 시스템 그 자체를 얼마나 더 확장가능한지 보여주었길 바랍니다. 오직 원래의 wave가 어떻게 사용되었는지를 이해하는 경우, 텍스쳐 측면 뿐만아니라 기하학 적으로 더 나은 wave 함수는 시스템을 상당히 개선할 수 있을 것입니다. 둘째로 설명된 시스템은 최소한의 리소스로 견고하고, 역동적이고, 컨트롤가능하고 현실적인 물 표면을 생성합니다. 시스템은 오직 vs.1.0과 ps.1.0 의 지원만 요구합니다. 현재 그리고 미래의 하드웨어에서, 빛의 전송과 다른 오브젝트와의 반응과 같은 영역에서 더 섬세한 효과로 나아가기 위해서 많은 리소스를 남깁니다.

     

    1.6 References

    Jeff Landers has a good bibliography of water techniques on the Darwin 3D Web site: http://www.darwin3d.com/vsearch/FluidSim.txt

     

    And another good one, on the Virtual Terrain Project Web site: http://www.vterrain.org/Water/index.html

     

    Brennan, Chris. 2002. "Accurate Reflections and Refractions by Adjusting for Object Distance." In ShaderX, edited by Wolfgang Engel. Wordware. http://www.shaderx.com

     

    Engel, Wolfgang. 2002. "Programming Pixel Shaders." In ShaderX, edited by Wolfgang Engel. Wordware. http://www.shaderx.com

     

    Enright, Douglas, Stephen Marschner, and Ronald Fedkiw. 2002. "Animation and Rendering of Complex Water Surfaces." In Proceedings of SIGGRAPH 2002. Available online at http://graphics.stanford.edu/papers/water-sg02/water.pdf

     

    Fernando, Randima, and Mark J. Kilgard. 2003. The Cg Tutorial. Addison-Wesley.

     

    Isidoro, John, Alex Vlachos, and Chris Brennan 2002. "Rendering Ocean Water." In ShaderX, edited by Wolfgang Engel. Wordware. http://www.shaderx.com

     

    Laeuchli, Jesse. 2002. "Simple Gerstner Wave Cg Shader." Online article. Available online at http://www.cgshaders.org/shaders/show.php?id=46

     

    Tessendorf, Jerry. 2001. "Simulating Ocean Water." In Proceedings of SIGGRAPH 2001. Course slides available online here at online.cs.nps.navy.mil

     

    Vlachos, Alex, John Isidoro, and Chris Oat. 2002. "Rippling Reflective and Refractive Water." In ShaderX, edited by Wolfgang Engel. Wordware. http://www.shaderx.com

     

    Yann, L. 2003. "Realistic Water Rendering." E-lecture. Available online at http://www.andyc.org/lecture/viewlog.php?log=Realistic%20Water%20Rendering,%20by%20Yann%20L

     

    댓글

Designed by Tistory & scahp.