재질(Direct3D 9)

재료는 다각형이 빛을 반사하거나 3D 장면에서 빛을 방출하는 것처럼 보이는 방법을 설명합니다. 재질 속성은 재질의 확산 반사, 주변 반사, 빛 방출 및 반사 하이라이트 특성을 자세히 설명합니다. Direct3D는 D3DMATERIAL9 구조를 사용하여 모든 재료 속성 정보를 전달합니다. 반사 속성을 제외하고 각 속성은 반사되는 광원 유형의 빨강, 녹색 및 파랑 부분의 양과 알파 혼합 계수를 나타내는 RGBA 색으로 설명됩니다.

확산 및 주변 리플렉션

D3DMATERIAL9 구조체의 Diffuse 및 앰비언트 멤버는 재질이 장면의 앰비언트 및 확산 조명을 어떻게 반영하는지 설명합니다. 대부분의 장면에는 주변 광원보다 훨씬 더 많은 확산 조명이 포함되어 있으므로 확산 반사는 색을 결정하는 데 가장 큰 역할을 합니다. 또한 확산 광원은 방향성이므로 확산 광원의 발생 각도는 반사의 전체 강도에 영향을 줍니다. 확산 반사는 조명이 꼭짓점 법선과 평행한 꼭짓점을 공격할 때 가장 큽니다. 각도가 증가하면 확산 반사의 효과가 감소합니다. 반사되는 광원의 양은 다음 그림과 같이 들어오는 광원과 꼭짓점 법선 사이의 각도의 코사인입니다.

반사된 광원의 양 그림

주변 광원과 같은 주변 리플렉션은 비방향입니다. 주변 반사는 렌더링된 개체의 명백한 색에 미치는 영향이 적지만 전체 색에 영향을 미치며 확산 조명이 거의 또는 전혀 반사되지 않을 때 가장 두드러집니다. 재질의 앰비언트 반사는 D3DRS_AMBIENT 플래그를 사용하여 IDirect3DDevice9::SetRenderState 메서드를 호출하여 장면에 대한 주변 광원 집합의 영향을 받습니다.

확산 및 앰비언트 리플렉션은 함께 작동하여 개체의 인식된 색을 확인하며 일반적으로 동일한 값입니다. 예를 들어 파란색 결정 개체를 렌더링하려면 확산 및 주변 광원의 파란색 구성 요소만 반영하는 재질을 만듭니다. 흰색 빛이 있는 방에 놓이면 크리스탈은 파란색으로 보입니다. 그러나 붉은 빛만 있는 방에서는 재료가 붉은 빛을 반사하지 않기 때문에 같은 크리스탈이 검은색으로 보입니다.

방출

재질을 사용하여 렌더링된 개체가 자체 광도로 보이도록 할 수 있습니다. D3DMATERIAL9 구조체의 Emissive 멤버는 내보낸 광원의 색과 투명도를 설명하는 데 사용됩니다. 발광은 개체의 색에 영향을 미칩니다. 예를 들어 어두운 재료를 밝게 만들고 발산되는 색을 부분적으로 띠게 만들 수 있습니다.

재질의 방출 속성을 사용하여 장면에 빛을 추가하는 계산 오버헤드를 발생시키지 않고도 개체가 빛을 방출하는 환상을 추가할 수 있습니다. 파란색 크리스탈의 경우, 발광 속성은 크리스탈이 밝아지는 것처럼 보이게하고 장면의 다른 물체에 빛을 투사하지 않으려면 유용합니다. 발광 속성이 있는 재질은 장면의 다른 개체에 의해 반사될 수 있는 빛을 내보내지 않습니다. 이 반사된 빛을 달성하려면 장면 내에 추가 조명을 배치해야 합니다.

반사 반사

반사 리플렉션은 개체에 하이라이트를 만들어 반짝이는 것처럼 보이게 합니다. D3DMATERIAL9 구조체에는 반사 강조 색과 재질의 전반적인 광택을 설명하는 두 개의 멤버가 포함되어 있습니다. 반사 멤버를 원하는 RGBA 색으로 설정하여 반사 하이라이트의 색을 설정합니다. 가장 일반적인 색은 흰색 또는 밝은 회색입니다. 전원 멤버에서 설정한 값은 반사 효과의 선명도를 제어합니다.

반사 하이라이트는 극적인 효과를 만들 수 있습니다. 파란색 크리스탈 비유에 다시 그리기 : 더 큰 전원 값은 크리스탈이 매우 빛나는 것처럼 보이게, 선명한 반사 하이라이트를 만듭니다. 값이 작을수록 효과 영역이 증가하여 크리스탈이 서리가 내린 것처럼 보이게 하는 둔한 반사가 생성됩니다. 개체를 무광택으로 만들려면 Power 멤버를 0으로 설정하고 Specular의 색을 검은색으로 설정합니다. 다양한 수준의 리플렉션을 실험하여 요구 사항에 맞는 현실적인 모양을 생성합니다. 다음 그림에서는 두 개의 동일한 모델을 보여 줍니다. 왼쪽의 반사 리플렉션 10을 사용합니다. 오른쪽의 모델에 반사 반사가 없습니다.

반사 리플렉션 모델의 그림

재질 속성 설정

Direct3D 렌더링 디바이스는 한 번에 하나의 재질 속성 집합으로 렌더링할 수 있습니다.

C++ 애플리케이션에서는 D3DMATERIAL9 구조를 준비한 다음 IDirect3DDevice9::SetMaterial 메서드를 호출하여 시스템에서 사용하는 재질 속성을 설정합니다.

사용할 D3DMATERIAL9 구조를 준비하려면 구조체의 속성 정보를 설정하여 렌더링하는 동안 원하는 효과를 만듭니다. 다음 코드 예제에서는 선명한 흰색 반사 하이라이트가 있는 자주색 재질에 대해 D3DMATERIAL9 구조를 설정합니다.

D3DMATERIAL9 mat;

// Set the RGBA for diffuse reflection.
mat.Diffuse.r = 0.5f;
mat.Diffuse.g = 0.0f;
mat.Diffuse.b = 0.5f;
mat.Diffuse.a = 1.0f;

// Set the RGBA for ambient reflection.
mat.Ambient.r = 0.5f;
mat.Ambient.g = 0.0f;
mat.Ambient.b = 0.5f;
mat.Ambient.a = 1.0f;

// Set the color and sharpness of specular highlights.
mat.Specular.r = 1.0f;
mat.Specular.g = 1.0f;
mat.Specular.b = 1.0f;
mat.Specular.a = 1.0f;
mat.Power = 50.0f;

// Set the RGBA for emissive color.
mat.Emissive.r = 0.0f;
mat.Emissive.g = 0.0f;
mat.Emissive.b = 0.0f;
mat.Emissive.a = 0.0f;

D3DMATERIAL9 구조를 준비한 후 렌더링 디바이스의 IDirect3DDevice9::SetMaterial 메서드를 호출하여 속성을 적용합니다. 이 메서드는 준비된 D3DMATERIAL9 구조체의 주소를 유일한 매개 변수로 허용합니다. 필요에 따라 새 정보로 IDirect3DDevice9::SetMaterial 을 호출하여 디바이스의 재질 속성을 업데이트할 수 있습니다. 다음 코드 예제에서는 코드에서 이 모양이 어떻게 표시되는지 보여 있습니다.

// This code example uses the material properties defined for 
// the mat variable earlier in this topic. The pd3dDev is assumed
// to be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
hr = pd3dDev->SetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

Direct3D 디바이스를 만들 때 현재 자료는 다음 표에 표시된 기본값으로 자동으로 설정됩니다.

멤버
확산 (R:0, G:0, B:0, A:0)
반사 (R:0, G:0, B:0, A:0)
앰비언트 (R:0, G:0, B:0, A:0)
Emissive (R:0, G:0, B:0, A:0)
고급 (0.0)

 

재질 속성 검색

디바이스에 대한 IDirect3DDevice9::GetMaterial 메서드를 호출하여 렌더링 디바이스에서 현재 사용 중인 재질 속성을 검색합니다. IDirect3DDevice9::SetMaterial 메서드와 달리 IDirect3DDevice9::GetMaterial에는 준비가 필요하지 않습니다. IDirect3DDevice9::GetMaterial 메서드는 D3DMATERIAL9 구조체의 주소를 허용하고 반환하기 전에 현재 재질 속성을 설명하는 정보로 제공된 구조를 채웁니다.

// For this example, the pd3dDev variable is assumed to 
// be a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DMATERIAL9 mat;

hr = pd3dDev->GetMaterial(&mat);
if(FAILED(hr))
{
    // Code to handle the error goes here.
}

참고

애플리케이션에서 렌더링에 대한 재질 속성을 지정하지 않으면 시스템에서 기본 재질을 사용합니다. 기본 재질은 앰비언트 또는 반사 반사가 없고 발광 색이 없는 모든 확산 조명(예: 흰색)을 반영합니다.

 

조명 및 재질