GPU Gems 1

Chapter 8. Simulating Diffraction

공대나온남자 2009. 4. 23. 01:00

원문: http://http.developer.nvidia.com/GPUGems/gpugems_ch08.html

Chapter 8. Simulating Diffraction

Jos Stam
Alias Systems

8.1 What Is Diffraction?

Most surface reflection models in computer graphics ignore the wavelike effects of natural light. This is fine whenever the surface detail is much larger than the wavelength of light (roughly a micron). For surfaces with small-scale detail such as a compact disc, however, wave effects cannot be neglected. The small-scale surface detail causes the reflected waves to interfere with one another. This phenomenon is known as diffraction.

 

컴퓨터 그래픽에서 모델링하는 대부분의 표면 반사는 자연 빛의 파동 같은 효과들은 무시한다. 표면의 세밀함이 빛의 파장(대략 1 미크론)보다 훨씬 클 때에는 이것이 적절하다. 하지만 CD같이 작은 비율의 세밀함이 있는 표면의 경우, 파동 효과를 무시할 수 없다. 작인 비율의 표면 세밀함은 반사된 파동이 다른 파동과 충돌한다. 이러한 현상을 회절이라고 한다.

 

Diffraction causes the reflected light from these surfaces to exhibit many colorful patterns, as you can see in the subtle reflections from a compact disc. Other surfaces that exhibit diffraction are now common and are mass-produced to create funky wrapping paper, colorful toys, and fancy watermarks, for example.

 

CD에서 미세하게 반사되는 것에서 볼 수 있는 것처럼, 회절은 이런 표면에서 반사되는 빛이 많은 색의 패턴을 나타내게 한다. 회절을 나타내는 다른 표면은 이제 흔한 것이고 펑키 포장지, 다채로운 장난감, 팬시 워트마크 같은 것을 만들기 위해 대량 생산된다.

 

In this chapter we show how to model diffraction effects on arbitrary surfaces in real time. This is possible thanks to the programmable hardware available on current graphics cards. In particular, we provide a complete implementation of our shader using the Cg programming language. Our shader is a simplified version of the more general model described in our SIGGRAPH 1999 paper (Stam 1999).

 

이 챕터에서 우리는 실시간으로 임의의 표면에서 회절 효과를 어떻게 모델링하는지를 보여준다. 이것은 현재 그래픽 카드에서 프로그래밍 가능한 하드웨어를 이용할 수 있어서 가능한 것이다. 특히, Cg 프로그래밍 언어를 사용하여 우리의 쉐이더의 완전한 구현을 제공한다. 우리의 쉐이더는 SIGGRAPH 1999 논문 (Stam 1999)에 설명된 더 일반적인 모델의 간략화된 버전이다.

 

8.1.1 The Wave Theory of Light

At a fundamental level, light behaves as a wave. In fact, the ray theory of light used in computer graphics is an approximation of this wave theory. Waves appear in many physical theories of natural phenomena. This is not surprising, because Nature abounds with repeating patterns, both in space and in time.

 

기본적인 수준에서, 빛은 파동과 같이 작동한다. 사실, 컴퓨터 그래픽에서 사용된 빛의 광선 이론은 이런 파동 이론을 근사한 것이다. 파동은 자연 현상의 많은 물리 이론에서 나타난다. 전우주는 시공간에 반복되는 패턴들로 가득차 있기 때문에, 이것은 놀라운 것이 아니다.

 

The simple, one-dimensional wave in Figure 8-1 is completely described by its wavelength l and amplitude A. The wavelength characterizes the oscillating pattern, while the amplitude determines the intensity of the wave. Visible light comprises a superposition of these waves, with wavelengths ranging from 0.5 microns (ultraviolet) to 1 micron (infrared). The color of a light source is determined by the distribution of amplitudes of the waves emanating from it. For example, a reddish light source is composed mainly of waves whose wavelengths peak in the 1-micron range, but sunlight has an equal distribution of waves across all wavelengths.

 

그림 8-1에 있는 간단한 1차 파동은 파장 l 와 진폭 A 으로 완전히 설명된다. 파장은 진동 패턴을 나타내고, 진폭은 파동의 세기를 결정한다. 가시 광선은 파장의 범위가 0.5 미크론(자외선)에서 1 미크론(적외선)인 광선들이 겹쳐 구성되어있다. 광원의 색은 광원에서 발산되는 파동의 진폭 분포에 의해 결정된다. 예를 들면, 붉은 광원은 주로 파장이 1미크론 범위에 있는 파동으로 구성되어 있고, 반면 태양광은 모든 파장에 걸쳐 파동이 동일하게 분포되어 있다.

 

fig08-01.jpg

Figure 8-1 Light Waves Range from Ultraviolet to Infrared

 

8.1.2 The Physics of Diffraction

Our simple diffraction shader models the reflection of light from a surface commonly known as a diffraction grating. A diffraction grating is composed of a set of parallel, narrow reflecting bands separated by a distance d . Figure 8-2a shows a cross section of this surface.

 

우리의 간단한 회절 쉐이더는 일반적으로 회절 격자로 알려진 표면에서의 빛 반사를 모델링한다. 회절 격자는 거리가 d 만큼 떨어진 평행하고 좁은 반사 띠의 모음으로 이루어져있다. 그림 8-2a는 이 표면의 단면도를 보여준다.

 

fig08-02.jpg

Figure 8-2 A Diffraction Grating

 

A light wave emanating from a light source is usually approximated by a planar wave. A cross section of this wave is depicted by drawing the lines that correspond to the crests of the wave. Unlike a simple, one-dimensional wave, a planar wave requires a specified direction, in addition to its wavelength and amplitude. Figure 8-2a depicts a planar wave incident on our diffraction grating. Note that the spacing between the lines corresponds to the wavelength l. When this type of planar wave hits the diffraction grating, it generates a spherical wave at each band, as shown in Figure 8-2b. The wavelength of the spherical waves is the same as that of the incoming planar, and their crests are depicted similarly. The only difference is that the crests lie on concentric circles instead of parallel lines. The reflected wave at any receiving point away from the surface is equal to the sum of the spherical waves at that location.

 

광원에서 나오는 빛 파동은 보통 2차원 파동으로 근사한다. 이 파동의 단면도는 파동의 꼭대기에 해당하는 선을 그려 묘사한다. 간단한 1차원 파동과는 달리, 2차원 파동은 파장과 진폭외에 방향이 필요하다. 그림 8-2a는 회절 격자에의 2차원 파동 투사를 나타낸다. 선 사이의 공간은 파장 l에 해당한다는 것을 주목하라. 이런 종류의 2차원 파동이 회절 격자와 충돌할 때, 그림 8-2b와 같이 각 띠에서 원형 파동이 발생한다. 이 원형 파동의 파장은 입사 파동의 파장과 같고, 원형 파동의 꼭대기는 비슷하게 묘사된다. 유일하게 다른점은 꼭대기가 평행선 대신 중심이 같은 원에 놓여있다는 것이다. 지면에서 떨어진 지점에서의 반사된 파동은 그 위치에 있는 원형 파동의 합과 같다.

 

The main difference between the wave theory and the usual ray theory is that the amplitudes do not simply add up. Waves interfere. We illustrate this phenomenon in Figure 8-3, where we show two extreme cases. In the first case (a), the two waves are "in phase" and the amplitudes add up, as in the ray theory. In the second case (b), the waves cancel each other, resulting in a wave of zero amplitude. These two cases illustrate that waves can interfere both positively and negatively. In general, the resulting wave lies somewhere in between these two extremes. The first case is, however, the one we are most interested in: When waves interfere in phase, they produce the maximum possible intensity, which eventually will be observed at the receiver.

 

파동 이론과 일반적인 광선 이론의 주요 차이점은 진폭을 합하는게 간단하지 않다는 것이다. 파동들은 서로를 간섭한다. 이 현상이 그림 8-3에 두 극단적인 경우로 나와있다. 첫번째 경우 (a)에서는, 두 파동이 “위상이 같아”, 진폭이 광선 이론에서처럼 합해진다. 두번째 경우 (b)에서는, 파동이 서로를 상쇄시켜, 파동의 진폭이 0이 된다. 이 두 경우는 파동이 긍정적 간섭과 부정적 간섭을 모두 한다는 것을 나타낸다. 일반적으로, 최종 파동은 이 두 극단적인 경우 사이에 있다. 그러나, 첫번째 경우가 우리가 가장 관심을 가지는 경우이다. 파동이 같은 위상에서 간섭할 때, 가능한 최대의 세기를 생성되어, 결국 관찰자가 보게 될 것이다.

 

fig08-03.jpg

Figure 8-3 Wave Interference

 

We now explain in more detail the notion of waves being in phase. As is usual in this situation, we assume that the light source and the receiver are "far away" from the surface, as compared to the size of the surface detail. This is reasonable because the surface detail is a couple of microns wide, and we often observe a surface from a distance of 1 meter. That's six orders of magnitude in scale. In this case, we can assume that all the waves emanating from the surface and ending up at the receiver are parallel. Therefore, the waves reaching the receiver are exactly in phase when the paths from the light source to the receiver for different bands differ only by multiples of the wavelength l. Let q 1 be the angle of the direction of the incident planar wave and q 2 be the angle to the receiver.

 

이제 같은 위상에 있는 파동의 개념을 더 자세히 설명할 것이다. 이 경우에 일반적으로, 광원과 관찰자는 표면 세밀함의 크기와 비교해서 표면에서 “멀리” 있는 것으로 가정한다. 표면 세밀함은 넓이가 2미크론이고 보통 표면을 1미터정도 떨어진 거리에서 보기 때문에 이러한 가정은 적절하다. 6개의 크기 단위가 있다. 이 경우에는, 표면에서 나와 관찰자에게 가는 모든 파동은 평행하다고 가정할 수 있다. 그러므로, 관찰자에게 도착하는 파동은 각 띠를 거쳐 광원에서 관찰자로 가는 경로가 파장 l 의 배수만큼만 차이가 날 때 정확히 같은 위상에 있게 된다. 입사 2차원 파동 방향의 각을 q 1 이라고 하고, 관찰자로 가는 파동 방향의 각을 q 2 라고 하자.

 

Then, from Figure 8-4 and using some basic trigonometry, we conclude that the waves are in phase whenever:

 

그러면, 그림 8-4에서 기본적인 삼각법을 사용해서, 다음과 같은 때에 파동이 항상 같은 위상에 있다고 할 수 있다.

 

126equ01.jpg

 

where n is an arbitrary positive integer and u = sin q 1 - sin q 2. This relation gives us exactly the wavelengths that interfere to give a maximum intensity at the receiver. These wavelengths are:

 

n 은 임의의 양의 정수이고, u = sin q 1 - sin q 2이다. 이 관계는 관찰자에 최대 세기를 주는 파장을 정확히 이끌어낸다. 이 파장은 다음과 같다.

 

126equ02.jpg

fig08-04.jpg

Figure 8-4 Angles Used for Computing the Difference in Phase Between Reflected Waves

 

Because n is arbitrary, this gives us an infinite number of wavelengths. However, only the wavelengths in the range [0.5, 1] microns correspond to visible light. So this gives us a range of possible values for n in terms of |u| and the spacing d:

 

n 은 임의의 수이기 때문에, 이것은 무한 크기의 파장을 준다. 하지만, [0.5, 1] 미크론 범위에 있는 파장만이 가시 광선과 일치한다. 그래서 n 와 간격 d 의 항으로 n 값의 가능한 범위를 얻을 수 있다.

 

127equ01.jpg

 

Consequently, the color of the light at the receiver is equal to the sum of the colors of all waves having wavelengths given by the preceding formula.

 

그 결과, 관찰자가 보는 빛의 색은 위의 식으로 얻은 파장을 가지는 모든 파동의 색을 합한 것과 같다.

What is the color corresponding to a given wavelength? As stated previously, the colors range from red to violet in a rainbow fashion. Although the exact color can be determined theoretically for a specific wavelength, we rely on a simple approximation instead. All that we require is a rainbow map, with colors ranging from violet to red, mimicking the rainbow. Let C(l) = (R(l), G(l), B(l)) be such a map, returning an RGB value for each wavelength l in the interval [0.5, 1] microns. Then the color of the light reaching the observer is given by summing the colors C(|u|d/n) for each valid n. Notice that when u = 0 (exact reflection), all wavelengths contribute to the reflection. We will deal with this case separately in the implementation of our shader.

 

주어진 파장에 일치하는 색은 무엇일까? 이전에 말한 것과 같이, 색은 무지개처럼 빨간색에서 보라색까지의 범위를 가진다. 특정 파장에 대해 정확한 색을 이론적으로 결정할 수 있긴 하지만, 그 대신에 간단한 근사를 이용한다. 무지개를 흉내낸, 보라색에서 빨간색까지의 색 범위를 가지는 무지개 맵만 있으면 된다. [0.5, 1] 미크론 범위에서 각 파장 l 에 대해 RGB 색을 반환하는, C(l) = (R(l), G(l), B(l)) 인 그런 맵이 있다고 하자. 그러면 관찰자에 도달하는 빛의 색은 각 유효값 n 에 대해 색 C(|u|d/n)을 합한 것이 된다. u = 0 (정확한 반사)일 때에는, 모든 파장이 반사에 기여한다는 것을 주의하라. 우리는 쉐이더 구현에서 개별적으로 이런 경우를 다룰 것이다.

 

8.2 Implementation

We now describe our implementation of the theory as a vertex program in Cg. Of course, we could have implemented it using a fragment program. Our implementation should work for any mesh, as long as a "tangent vector" is provided, plus the normal and position for each vertex. The tangent vectors supply the local direction of the narrow bands on the surface. For a compact disc, they are in the direction of the tracks, as shown in Figure 8-5.

 

이제 Cg에서의 정점 프로그래밍으로 이론의 구현을 설명하겠다. 물론, 우리는 단편 프로그램을 사용하여 구현할 수 있었다. 우리의 구현은 각 정점에 대해 법선과 위치와 더불어 “탄젠트 벡터”가 제공되는 한, 어떤 메쉬에서도 작동해야 한다. 탄젠트 벡터는 표면에 있는 좁은 띠의 지역 방향을 제공한다. CD의 경우, 그림 8-5에서처럼, 탄젠트 벡터는 트랙의 방향이 된다.

 

fig08-05.jpg

Figure 8-5 Tangent Vectors for the Compact Disc

 

The complete implementation of our vertex program is given in Listing 8-1.

 

우리의 정점 프로그램의 완전한 구현의 Listing 8-1과 같다.

 

Example 8-1. The Diffraction Shader Vertex Program

float3 blend3 (float3 x)
 {
   float3 y = 1 - x * x;
   y = max(y, float3 (0, 0, 0));
   return (y);
 }
 void vp_Diffraction (
   in float4 position : POSITION,
   in float3 normal   : NORMAL,
   in float3 tangent  : TEXCOORD0,
   out float4 positionO : POSITION,
   out float4 colorO    : COLOR,
   uniform float4x4 ModelViewProjectionMatrix,
   uniform float4x4 ModelViewMatrix,
   uniform float4x4 ModelViewMatrixIT,
   uniform float r,
   uniform float d,
   uniform float4 hiliteColor,
   uniform float3 lightPosition,
   uniform float3 eyePosition
 )
 {
   float3 P = mul(ModelViewMatrix, position).xyz;
   float3 L = normalize(lightPosition - P);
   float3 V = normalize(eyePosition - P);
   float3 H = L + V;
   float3 N = mul((float3x3)ModelViewMatrixIT, normal);
   float3 T = mul((float3x3)ModelViewMatrixIT, tangent);
   float u = dot(T, H) * d;
   float w = dot(N, H);
   float e = r * u / w;
   float c = exp(-e * e);
   float4 anis = hiliteColor * float4(c.x, c.y, c.z, 1);
   if (u < 0) u = -u;
   float4 cdiff = float4(0, 0, 0, 1);
   for (int n = 1; n < 8; n++)
   {
     float y = 2 * u / n - 1;
     cdiff.xyz += blend3(float3(4 * (y - 0.75), 4 * (y - 0.5),
                                4 * (y - 0.25)));
   }
   positionO = mul(ModelViewProjectionMatrix, position);
   colorO = cdiff + anis;
}

The code computes the colorful diffraction pattern and the main anisotropic highlight corresponding to the u = 0 case.

 

코드는 다채로운 회절 패턴과 u = 0 인 경우에 해당하는 주요 이방성 하이라이트를 계산한다.

 

Let's first describe the computation of the diffraction pattern. From the halfway vector between the light source and the receiver (not normalized), we compute the u value by projecting it onto the local tangent vector. From this value and the spacing d, we then compute the wavelengths that interfere in phase. If we compute the wavelength correctly, we should first determine the range of n values that are valid, and then sum over the corresponding colors. However, currently the Cg compiler unrolls its for loops; therefore the size of the loop is limited by the allowable size of the vertex program. So we decided to use a fixed number of allowable n's in our implementation. The value we currently use is 8. In later versions of our shader, we might want to allow variable for loops, depending on |u| and d, as explained in Section 8.1.2.

 

우선 회절 패턴의 계산부터 알아보자. 광원과 관찰자 (정규화되지 않음) 사이의 중간 벡터를 지역 탄젠트 벡터에 투영하여 u 값을 계산한다. 그런 다음, 이 값과 거리 d 를 이용하여 같은 위상에 있는 파장을 계산한다. 파장을 정확히 계산하려면, 우선 n 값의 범위가 유효한지 결정한 다음 그에 해당하는 색을 모두 합해야 한다. 하지만, 현재 Cg 컴파일러는 for 루프를 사용한다. 따라서 루프의 크기는 정점 프로그램이 허용하는 크기에 제한된다. 그래서 우리는 우리의 구현에서 허용된 n 의 개수를 고정된 수로 사용하기로 결정했다. 우리가 현재 사용한 수는 8이다. 이후 버전의 쉐이더에서는, 섹션 8.1.2에서 설명한 것과 같이, |u| 와 d 에 따라 for 루프에 변수를 사용하길 원할 수도 있다.

 

To determine the color corresponding to a given wavelength, we use a simple approximation of a rainbow map. Basically, the map should range from violet to red and produce most colors in the rainbow. We found that a simple blend of three identical bump functions (which peak in the blue, green, and red regions) worked well, as shown in Figure 8-6.

 

주어진 파장에 맞는 색을 결정하기 위해, 무지개 맵의 간단한 근사를 사용한다. 기본적으로, 맵은 보라색에서 빨간색의 범위를 가져야하고 무지개에 있는 대부분의 색을 생성해야 한다. 우리는 동일한 3개의 범프 함수(파랑, 녹색, 빨강 영역에 최고점을 두는)를 간단히 혼합하여 이것이 잘 작동하게 하는 방법을 발견했다. 그림 8-6을 보라.

 

fig08-06.jpg

Figure 8-6 The Rainbow Color Map Used in the Shader

 

More precisely, our bump function is equal to:

 

더 정확하게는, 우리의 범프 함수는 다음과 같다:

 

129equ01.jpg

 

Then, using this function, we can define the RGB components of our rainbow map as:

 

이 함수를 사용하여, 우리의 무지개 맵의 RGB 성분을 다음과 같이 정의할 수 있다.

ch08_eqn008.jpg

 

where y = 2l - 1 maps the wavelength to the [0, 1] micron range, and C is a shape parameter that controls the appearance of the rainbow map. In our implementation we found that C = 4.0 gave acceptable results. This is just one possible rainbow map. In fact, a better solution might be to use a one-dimensional texture map or a table lookup.

 

y = 2l - 1은 파장의 범위를 [0, 1]로 바꾸고, C 는 무지개 맵의 형태를 조절하는 형태 매개변수이다. 우리의 구현에서, C = 4.0일 때 만족스러운 결과가 나온다는 것을 발견했다. 이것은 무지개 맵의 한가지 가능성일 뿐이다. 사실, 1차원 텍스쳐 맵이나 테이블 룩업이 더 나은 해법이 될 수도 있다.

 

The case when u = 0 is dealt with using a simple anisotropic shader. Theoretically, this should just correspond to an infinitely thin white highlight. However, the irregularities in the bumps on each of the bands of the diffraction grating (on a compact disc, for example) cause a visible spread of the highlight. Therefore, we decided to model this contribution with a simple anisotropic shader by Greg Ward (Ward 1992). The spread of the highlight is modeled using a roughness parameter r and its color is given by the hiliteColor parameter. The resulting expression for this contribution is:

 

u = 0일 때의 경우는 간단한 이방성 쉐이더를 사용하여 다룬다. 이론적으로, 이것은 무한히 얇은 하얀 하이라이트에만 일치해야한다. 하지만, 회절 격자의 각 띠 (예를 들면, CD) 에서 범프의 불규칙성은 하이라이트가 확산되어 보이게 한다. 그러므로, 우리는 Greg Ward (Ward 1992) 의 간단한 이방성 쉐이더를 사용하여 이 기여도를 모델링하기로 결정했다. 하이라이트의 확산은 거칠기 매개변수 r 을 사용하여 모델링하고 색은 매개변수 hiliteColor 에 의해 주어진다. 이 기여도를 위한 최종 표현식은 다음과 같다.

 

ch08_eqn009.jpg

 

where w is the component of the halfway vector in the normal direction.

 

w 은 법선 방향에 대한 중간 벡터의 성분 ( dot(N,H) ) 이다.

The final color is simply the sum of the colorful diffraction pattern and the anisotropic highlight.

 

최종 색은 단순히 회절 패턴의 색과 이방성 하이라이트를 합한 것이다.

8.3 Results

We wrote a program that uses the diffraction vertex shader to visualize the reflection from a compact disc. The compact disc is modeled as a set of thin quads. Of course, our shader is not restricted to the geometry of a compact disc: all that is required is that a tangent direction be provided for each vertex.

 

우리는 CD에서의 반사를 시각화하기 위해 회절 정점 쉐이더를 사용하여 프로그램을 작성하였다. CD는 얇은 사각형으로 모델링된다. 물론, 우리의 쉐이더는 CD의 기하에 제한되지 않는다. 각 정점에 대한 탄젠트 방향만 주어지면 된다.

 

In addition, we added a thin transparent layer on the compact disc with a Fresnel-like reflection shader. This layer reflects the environment more strongly for glancing angles. Figure 8-7 shows three snapshots of our real-time demo, with the CD in three different positions. Figure 8-8 shows our diffraction shader applied to a surface where we have texture-mapped the principal direction of anisotropy.

 

또한, 프레넬과 같은 반사 쉐이더를 이용해 CD에 얇고 투명한 층을 추가하였다. 이 층은 스침각에 대해 환경을 더 강하게 반사한다. 그림 8-7은 3가지 다른 위치에서 CD를 보여주는, 우리의 실시간 데모의 스크린샷이다. 그림 8-8은 이방성의 주요방향을 텍스쳐 맵핑한 표면에 우리의 회절 쉐이더를 적용한 것을 보여준다.

 

 

Figure 8-7 Three Snapshots of Our Compact Disc Real-Time Demo

 

fig08-08.jpg

Figure 8-8 Three Snapshots of a Surface with a Texture-Mapped Principal Direction of Anisotropy

 

8.4 Conclusion

We have shown how to implement a simple diffraction shader that demonstrates some of the wavelike features of natural light. Derivations for more complicated surface detail can be found in our SIGGRAPH 1999 paper (Stam 1999). Readers who are interested in learning more about the wave theory of light can consult the classic book Principles of Optics (Born and Wolf 1999), which we have found useful. Possible directions of future work might include more complicated surfaces than a simple diffraction grating. For example, it would be challenging to model the reflection from metallic paints, which consist of several scattering layers. The small pigments in these paints cause many visible wavelike effects. Developing such a model would have many applications in the manufacturing of new paints.

 

우리는 자연 빛의 파동과 같은 특성을 나타내는 간단한 회절 쉐이더를 어떻게 구현하는지 보여주었다. 더 복잡한 표면 세밀함을 위한 방법은 우리의 SIGGRAPH 1999 문서(Stam 1999)에서 찾아볼 수 있다. 빛의 파동 이론에 대해 더 알고 싶은 독자들은 책 Principles of Optics (Born and Wolf 1999)을 참고하면 된다. 미래에는 간단한 회절 격자보다 더 복잡한 표면을 사용하게 될 수도 있다. 예를 들면, 여러 산란층으로 구성된 금속 도료에서의 반사를 모델링하는 것은 흥미로울 것이다. 이 도료에 있는 작은 안료들은 파동과 같은 효과를 많이 발생시킨다. 그런 모델을 개발하는 것은 새 도료의 제조에서 많이 적용될 것이다.

 

8.5 References

Born, Max, and Emil Wolf. 1999. Principles of Optics: Electromagnetic Theory of Propagation, Interference and Diffraction to Light, 7th ed. Cambridge University Press.

Stam, Jos, 1999. "Diffraction Shaders." In Proceedings of SIGGRAPH 99, pp. 101–110.

Ward, Greg. 1992. "Measuring and Modeling Anisotropic Reflection." In Proceedings of SIGGRAPH 92, pp. 265–272.


Copyright

Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and Addison-Wesley was aware of a trademark claim, the designations have been printed with initial capital letters or in all capitals.

The authors and publisher have taken care in the preparation of this book, but make no expressed or implied warranty of any kind and assume no responsibility for errors or omissions. No liability is assumed for incidental or consequential damages in connection with or arising out of the use of the information or programs contained herein.

The publisher offers discounts on this book when ordered in quantity for bulk purchases and special sales. For more information, please contact:

      U.S. Corporate and Government Sales
      (800) 382-3419
      
corpsales@pearsontechgroup.com

For sales outside of the U.S., please contact:

      International Sales
      international@pearsoned.com

Visit Addison-Wesley on the Web: www.awprofessional.com

Library of Congress Control Number: 2004100582

GeForce™ and NVIDIA Quadro® are trademarks or registered trademarks of NVIDIA Corporation.
RenderMan® is a registered trademark of Pixar Animation Studios.
"Shadow Map Antialiasing" © 2003 NVIDIA Corporation and Pixar Animation Studios.
"Cinematic Lighting" © 2003 Pixar Animation Studios.
Dawn images © 2002 NVIDIA Corporation. Vulcan images © 2003 NVIDIA Corporation.

Copyright © 2004 by NVIDIA Corporation.

All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form, or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior consent of the publisher. Printed in the United States of America. Published simultaneously in Canada.

For information on obtaining permission for use of material from this work, please submit a written request to:

      Pearson Education, Inc.
      Rights and Contracts Department
      One Lake Street
      Upper Saddle River, NJ 07458

Text printed on recycled and acid-free paper.

5 6 7 8 9 10 QWT 09 08 07

5th Printing September 2007