2 2 - Tistory

Download Report

Transcript 2 2 - Tistory

Texturing
Texturing
렌더링된 장면이 더욱 현실적으로 보이게 만들기
위해 3D 기초물에 텍스쳐를 적용하는 기능
Direct3D의 텍스처는 단순한 색 패턴.
객체의 기하학적인 굴곡 정보는 전혀 변형이 없다.
2
Texture Coordinates
텍스쳐 좌표




대부분 색 값을 가지는 2차원 배열인 비트맵(환경 매핑은
예외)
기초물을 정의하는 정점에 텍스처 좌표를 할당.
(u, v) : (0.0,0.0),(1.0, 0.0), (1.0, 1.0), (0.0, 1.0)
텍셀 : 배열의 각 항을 텍스처에서 u(열), v(행)으로 정의
되는 주소구조.
3
Texture Coordinates
4
Texture Resource
IDirect3DTexture8 Interface로 지원.
지원 함수








IDirect3DDevice8::CreateTexture
D3DXCreateTexture
D3DXCreateTextureFromFile
D3DXCreateTextureFromFileEx
D3DXCreateTextureFromFileInMemory
D3DXCreateTextureFromFileInMemoryEx
D3DXCreateTextureFromResource
D3DXCreateTextureFromResourceEx
LPDIRECT3DTEXTURE8 pTexture;
D3DXCreateTextureFromFile( d3dDevice, "tiger.bmp", &pTexture);
5
Creating Texture Surfaces
DirectX 7에서 텍스처의 실제는 DirectDraw Surface.
비트맵을 읽어들어 텍스처로 복사.
static LPDIRECTDRAWSURFACE7
CreateTextureFromBitmap( LPDIRECT3DDEVICE7 pd3dDevice, HBITMAP
hbm )
{
LPDIRECTDRAWSURFACE7 pddsTexture;
HRESULT hr;
D3DDEVICEDESC7 ddDesc;
// Get the bitmap structure (to extract width, height, and bpp).
if( FAILED( pd3dDevice->GetCaps( &ddDesc ) ) )
return NULL;
BITMAP bm;
GetObject( hbm, sizeof(BITMAP), &bm );
DWORD dwWidth = (DWORD)bm.bmWidth;
DWORD dwHeight = (DWORD)bm.bmHeight;
6
DDSURFACEDESC2 ddsd;
ZeroMemory( &ddsd, sizeof(DDSURFACEDESC2) );
ddsd.dwSize = sizeof(DDSURFACEDESC2);
ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH |
DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
ddsd.dwWidth = dwWidth;
ddsd.dwHeight = dwHeight;
// 하드웨어 장치를 위한 텍스처 관리를 설정.
if( ddDesc.deviceGUID == IID_IDirect3DHALDevice )
ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
else if( ddDesc.deviceGUID == IID_IDirect3DTnLHalDevice )
ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
else
ddsd.ddsCaps.dwCaps |= DDSCAPS_SYSTEMMEMORY;
7
if( ddDesc.dpcTriCaps.dwTextureCaps & D3DPTEXTURECAPS_POW2 )
{
if( ddsd.dwWidth > ddsd.dwHeight )
ddsd.dwHeight = ddsd.dwWidth;
else
ddsd.dwWidth = ddsd.dwHeight;
}
if( 0L == ddsd.ddpfPixelFormat.dwRGBBitCount )
return NULL;
// Get the device's render target so that we can use the render
// target to get a pointer to a DDraw object. We need the
// DirectDraw interface for creating surfaces.
LPDIRECTDRAWSURFACE7 pddsRender;
LPDIRECTDRAW7 pDD;
pd3dDevice->GetRenderTarget( &pddsRender );
pddsRender->GetDDInterface( (VOID**)&pDD );
pddsRender->Release();
8
// Create a new surface for the texture.
if( FAILED( hr = pDD->CreateSurface( &ddsd, &pddsTexture, NULL ) ) )
{
pDD->Release();
return NULL;
}
// Done with DDraw.
pDD->Release();
// Now copy the bitmap to the texture surface. To do this, we're
// creating a device context (DC) for the bitmap and a DC for
// the surface so that we can use the BitBlt() call to copy the actual bits.
// Get a DC for the bitmap.
HDC hdcBitmap = CreateCompatibleDC( NULL );
if( NULL == hdcBitmap )
{
pddsTexture->Release();
return NULL;
}
9
SelectObject( hdcBitmap, hbm );
// Get a DC for the surface.
HDC hdcTexture;
if( SUCCEEDED( pddsTexture->GetDC( &hdcTexture ) ) )
{
// Copy the bitmap image to the surface.
BitBlt( hdcTexture, 0, 0, bm.bmWidth, bm.bmHeight, hdcBitmap, 0, 0,
SRCCOPY );
pddsTexture->ReleaseDC( hdcTexture );
}
DeleteDC( hdcBitmap );
// Return the newly created texture.
return pddsTexture;
}
10
Assigning Texture Coordinates
매핑 방법

Affine mapping
 삼각형의 각 스캔라인 상에서 직선으로 텍스처 좌표를 보간,

perspective mapping
 폰리곤 상에서 u,v를 정확하기 변경하여 원근 왜곡을 교정.
3가지 옵션



사각형에 전체 텍스처를 적용.
텍스처의 왼쪽이나 오른쪽 절반을 평면에 적용.
랩핑, 크램핑, 미러링 같은 기법을 사용하기 위해 텍스처
주소 모드를 변경.
11
Texture-Addressing Modes
필요성

특별한 텍스처링 효과를 생성하기 위해 범위 밖의 값을
사용.
Border Color Texture-Addressing Mode


Direct3D가 텍스처 좌표를 위해 0.0에서 1.0까지의 값을
벗어난 텍두리 색을 사용하게 해준다.
D3DTADDRESS_BORDER
12
Texture-Addressing Modes
Wrap Texture-Addressing Mode


D3DTADDRESS_WRAP로 지정.
각 정수 접합 지정메서 반복.
pd3dDevice->SetTextureStageState( 0,
D3DTSS_ADDRESS,
D3DTADDRESS_WRAP );
13
Texture-Addressing Modes
Clamp Texture-Addressing Mode


D3DTADDRESS_CLAMP
범위는 (0.0-1.0)으로 제한
pd3dDevice->SetTextureStageState( 0, D3DTSS_ADDRESS,
D3DTADDRESS_CLAMP );
14
Texture-Addressing Modes
Mirror Texture-Addressing Mode




D3DTADDRESS_MIRROR
각 정수 접합 지점에서 텍스처를 미러링
텍스처 좌표 (0.0,0.0), (0.0, 4.0), (4.0, 4.0), (4.0, 0.0)은 네번
텍스처를 적용.
각 정수 지점에서 미러링
pd3dDevice->SetTextureStageState( 0,
D3DTSS_ADDRESS,
D3DTADDRESS_MIRROR );
15
Texture Filtering
텍스처 필터링


폴리곤에서 2D 픽셀 위치로 매핑하는 지점의 텍스처 색
상을 결정하는 과정.
축소 필터링, 확대 필터링, 밉 필터링.
Texture map
Untextured primitive
16
Texture Filtering
품질과 렌더링 시간 중에서 선택.

IDirect3DDevice8::SetTextureStageState 을 호출하여 필터
링 메소드를 선택.
방법




Nearest-Point Sampling
Linear Texture Filtering
Anisotropic Texture Filtering
Texture Filtering with Mipmaps
17
Texture Filtering
Nearest Point Sampling


질은 나쁘지만, 가장 빠른 방법.
축소/확대 시에 이미지 블럭화 현상이 나타남
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_POINT);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_POINT);
Linear Texture Filtering


근접 샘플 지점을 포함하는 상하좌우의 네 텍셀의 평균
을 계산
Bilinear, Trilinear Texture Filtering
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTFN_LINEAR);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTFG_LINEAR);
18
Texture Filtering
Anisotropy Texture Filtering

표면이 화면상의 플레인과 평행이 아닐경우 발생하는 왜
곡현상으로 Linear Filtering에 의해 생길수 있는 뭉침 현
상을 줄이기 위해 더 많은 표본을 사용.
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MINFILTER,
D3DTFN_ANISOTROPIC);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAGFILTER,
D3DTFG_ANISOTROPIC);
m_pd3dDevice->SetTextureStageState(0, D3DTSS_MAXANISOTROPY, 4);
Mipmap Texture Filtering

두 밉맵 간의 텍셀 간의 값을 표본으로 사용.
19
Texture Wrapping
정의


Direct3D가 텍스처링된 폴리곤을 래스터하는 방법과 각
정점을 위해 지정된 텍스처 좌표를 이용하는 방법에 영
향을 준다.
IDirect3DDevice8::SetRenderState로 설정(8가지).
20
Palletized Texture
메모리의 절약과 시각적인 효과를 개선하기 위해
DDSCAPS_TEXTURE 플래그를 지정.
팔레트된 텍스처의 지정




필요한 DirectDraw, Direct3D 기능을 DDSURFACEDESC2 구조에서
지정.
DDSCAPS_TEXTURE 플래그와 DDPF_PALEFFEINDEXEDn 픽셀
형식 플래그의 하나를 설정.
표면 생성 후 IDirectDraw7::CreatePallete 메소드를 사용하여
DirectDrawPalette 객체를 생성하여 초기화
IDirectDrawSurface7::SetPalette 메소드를 사용하여 표면과 팔레드를
연결
DirectX 8.0


총 256 개의 팔레트 지원
IDirect3DDevice8::SetCurrentTexturePalette 로 지정.
21
Automatic Texture Management
기능.

Direct3D가 객체에 적용할 수 있도록 렌더링에 필요한 텍
스처를 결정하고 비디오 메모리에 적재하는 과정.
기본적인 작업



유효 텍스처 메모리 관리.
현재 프레임 렌더링에 사용되는 텍스처 관리.
다시 사용할 수 있는 텍스처 이미지과 새로운 텍스처 이
미지로 대체해야 하는 표면 결정하기.
텍스처 관리 플래그



DDSCAPS2_HINTDYNAMIC
DDSCAPS2_HINTSTATIC
DDSCAPS2_OPAQUE
22
Texture Management
관리 : 성능 개선의 관점에서


텍스처는 비디오 메모리, 시스템 메모리 모두 저장.
Direct3D는 새로운 텍스처가 필요하면 비디오 메모리에
서 더 이상 사용하지 않는 텍스처를 지우고, 시스템메모
리에서 로드.
현재 관리되는 모든 텍스처를 축출.


IDirect3DDevice8::ResourceManagerDiscardBytes
IDirect3DDevice7::EvictManagedTexture
23
Texture Compression
기능



풍부한 색의 사용은 메모리 요구가 많음.
메모리간 전송 부하의 감소와 잦은 텍스처 접근에 따른 부하 감소
하드웨어적으로 지원.
DXT 형식




압축된 형식으로 이미지 데이터를 저장하는 DirectDraw 표면의 형식.
5가지 변형 형식
이미지를 4x4 텍셀 단위로 나누고, 각 단위별로 색 일관성을 이용하
여 동작.
DXT1은 24 비트 RGB인 경우 6배 압축을, DXT2-5 는 32비트 RGBA
이미지일 경우 4배 압축.
Setting for DDPIXELFORMAT's
dwFourCC Member
Description
DXT1
DXT2
DXT3
DXT4
DXT5
Opaque; 1-bit alpha
Explicit alpha
Explicit alpha
Interpolated alpha
Interpolated alpha
Alpha Premultiplied?
Not applicable
Yes
No
Yes
No
24
DXT 표면 사용하기
DXT 표면 설정


DirectDrawa 에서 DDPF_RGB 대신 DDPF_FOURCC 코드로 지정하
는 것이 차이.
DirectX 8.0에서는 IDirect3DDevice8::CreateTexture 사용
DDSURFACEDESC2 ddsd;
LPDIRECTDRAWSURFACE7
pddsCompressed = NULL;
ZeroMemory(&ddsd, sizeof(ddsd));
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_CAPS | DDSD_WIDTH | DDSD_HEIGHT |
DDSD_PIXELFORMAT;
ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE;
ddsd.ddsCaps.dwCaps2 = DDSCAPS2_TEXTUREMANAGE;
ddsd.dwWidth = 256;
ddsd.dwHeight = 256;
ddsd.ddpfPixelFormat.dwSize = sizeof(DDPIXELFORMAT);
ddsd.ddpfPixelFormat.dwFlags = DDPF_FOURCC;
ddsd.ddpfPixelFormat.dwFourCC = FOURCC_DXT1;
if (FAILED(hr = pDD->CreateSurface(&ddsd, &pddsCompressed, NULL)))
return hr;
return S_OK;
25
Mipmap
구성





각각 텍스처를 표현하는 낮은 해상도의 비트맵 이미지를 일련의 텍
스처로 구성.
모든 해상도에서 단일 텍스처를 렌더링할 필요가 없도록 텍스처를
위한 메모리를 사용을 줄이는 효율적인 방법 제공.
큰 이미지를 필터링을 통하여 작은 이미지로 바꿀수 있겠지만, 시
간 부하가 심하다.
Direct3D는 텍셀 대 픽셀 비율이 1에 가장 가까운 밉 맵 단계를 선택.
Direct3D 는 밉 맵을 연결된 표면의 체인으로 구성
26
Mipmap
MIP 맵 표면을 만드는 작업




CreateSurface를 사용하여 자동으로 생성.
DDSCAPS_COMPLEX, DDSCAPS_MIPMAP 기능 비트
로 표면 생성 후 표면 설명의 dwMipmapCount 값을 원하
는 MIP 레벨의 수로 설정.
1로 설정하면 Mipmap은 Disable
0으로 설정하면 일부 하드웨어에서는 자동으로 생성
(nVidia Riva TNT/TNT2)
27
Texture Interface Pointer
IDirect3D7 인터페이스는 IDirectDrawSurface7 인터
페이스를 통해 제공되는 텍스처를 생성하고 적용.
HRESULT IDirect3DDevice7::SetTexture(
DWORD dwStage,
LPDIRECTDRAWSURFACE7 lpTexture
);
IDirect3D8 인터페이스는 IDirect3DTexture8 인터페
이스를 통해 제공되는 텍스처를 생성하고 적용.
HRESULT IDirect3DDevice8:: SetTexture(
DWORD Stage,
IDirect3DBaseTexture8* pTexture
);
28
Texture Stage
기초물에서 한번에 8개까지의 텍스처를 결합하게
해주는 고급 텍스처 블렌딩 기능을 제공.
HRESULT IDirect3DDevice8::SetTextureStageState(
DWORD dwStage,
D3DTEXTURESTAGESTATETYPE dwState,
DWORD dwValue
);
Parameter
Description
dwStage
Stage identifier of the texture stage this call will affect; devices can currently
have up to eight set textures (valid values are 0 to 7)
dwState
Texture stage to be set; this parameter can be any member of the
D3DTEXTURESTAGESTATETYPE enumerated type setting
dwValue
State value to be set; the dwState parameter determines the meaning of this
value
29
Texture Blending
정의


기반이 되는 기초물의 색이나 같
은 기초물의 다른 텍스처에 텍스
처를 혼합하여 여러 가지 흥미로
운 효과를 구현할 수 있다.
다단계 텍스처 블렌딩
 여러 단계에 걸쳐 기초물에 다수의 텍
스처를 적용하는 과정

단일 단계 텍스처 블렌딩
 DirectX 6에서 제공 : 단일 단계로 블
렌딩 제공
30
Texture Blending Operations and Arguments
Applications associate a blending stage with each
texture in the set of current textures
IDirect3DDevice8::SetTextureStageState
Blending Arguements

D3DTSS_COLORARG1, D3DTSS_COLORARG2
 텍스쳐 색상 연산 인수의 소스를 설명.

D3DTSS_ALPHARG1,D3DTSS_ALPHARG2
 텍스쳐 알파 연산에서 인수를 제공.
Assigning the Current Textures

d3dDevice->SetTexture(2, pTexture);
31
Creating blending stages
// This example assumes that lpD3DDev is a valid pointer to an
// IDirect3DDevice8 interface.
// Set the operation for the first texture.
d3dDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_ADD);
// Set argument 1 to the texture color.
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
// Set argument 2 to the iterated diffuse color.
d3dDevice->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
#define SetTextureColorStage( dev, i, arg1, op, arg2 ) \
dev->SetTextureStageState( i, D3DTSS_COLOROP, op);
\
dev->SetTextureStageState( i, D3DTSS_COLORARG1, arg1 ); \
dev->SetTextureStageState( i, D3DTSS_COLORARG2, arg2 );
#define SetTextureAlphaStage( dev, i, arg1, op, arg2 ) \
dev->SetTextureStageState( i, D3DTSS_ALPHAOP, op);
\
dev->SetTextureStageState( i, D3DTSS_ALPHARG1, arg1 ); \
dev->SetTextureStageState( i D3DTSS_ALPHARG2, arg2 );
32
Alpha Texture Blending
색 정보의 통합


구현시에 정점 색, material, texture map 등의 여러 정보의
색정보를 통합.
Alpha






블렌딩이 수행되는 방법을 지정.
일반적으로 불투명도의 측정 단위로 취급
0 : 완전 투명
1 : 완전 불투명
FinalColor = TexelColor * SourceBlendFactor +
TexelColor * DestBlendFactor
SetRenderState에서
D3DRENDERSTATE_ALPHABLENDERALBE 를 TRUE
로 설정
33
Texture Stages Using Alpha
IDirect3D8과 IDirectDevice8 은 한단계에서 8개까지의 텍스
처 혼합을 지원.
텍스처 블렌딩 단계

D3DTSS_ALPHAOP
 A texture alpha-blending operation,

D3DTSS_ALPHAARG1
 The first alpha argument for the stage, identified by a texture argument flag.

D3DTSS_ALPHAARG2
 The second alpha argument for the stage, identified by a texture argument
flag. The default argument is D3DTA_CURRENT.
m_pd3dDevice->SetTextureStageState( i, D3DTSS_ALPHAOP, op);
m_pd3dDevice->SetTextureStageState( i, D3DTSS_ALPHAARG1, arg1 );
m_pd3dDevice->SetTextureStageState( i, D3DTSS_ALPHAARG2, arg2 );
34
Light Mapping with Textures
영상의 사실감을 높이기 위해 광원 효과를 추가.
기존의 기법으로는 원하는 기능을 지원하기 힘듬.
다중 텍스처 매핑을 적용하면 하나 이상의 라이트
맵이 적용가능.
기능




Monochrome Light Maps
Color Light Maps
Specular Light Maps
Diffuse Light Maps
35
Light Mapping
방법




모노크롬이나 칼라 상태의 라이팅 정보를 가지는 텍스처
를 이미 단색이나 기반 텍스처를 가지는 기초물에 적용
하는 것.
실행과정이 아니라, 저작 단계에서 라이트 맵핑 정보를
계산하므로 빠른 속도 효과를 얻음.
화면을 어둡게 처리하며 완전히 저명된 기반 텍스처의
상단에 두번째 블렌딩된 텍스처로 라이트 맵을 적용하는
기술이므로 다크 매핑(Dart Mapping)이라고도 함.
라이트맵의 생성 RayTracer, Radiosity 등의 기법을 사용
하여 생성한 후 Direct3D에 적용가능.
36
Light Mapping
과정

라이트 매핑을 수행하기 위해서는 두가지 텍스처를 적용.
Monochromatic Light map
Flashlight beam light map
기반 텍스쳐
37
Light Mapping with Multipass Texture Blending
사용되는 텍스처를 다양한 방법으로 혼합가능.
Monochromatic Light Mapping


라이트 맵 텍스처의 알파 정보를 기반으로 장면을 어둡
게 하기 위해 사용.
버퍼의 내용을 스케일링하여 프레임을 어둡게 하는 라이
트 맵으로 소스 기초물을 사용.
device->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO);
device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_SRCALPHA);

라이트 맵에존재하는 않는 색은 0을 곱해 무시하고, 최종
픽셀 색을 이 라이트 앱의 알파값과 기반이 되는 텍스처
의 색의 곱이 되도록 설정.
38
Light Mapping with Multipass Texture Blending
Color Light Mapping


표면에 칼라 라이트 맵을 적용.나머지는 모노크롬 라이
트 매핑과 동일
대상 알파 블렌드 상태를 D3DBLEND_SRCCOLOR로 설
정.
device->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, TRUE);
device->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO);
device->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_SRCCOLOR);
39
Monochromatic and Color light Maps
// Set up the texture stages. (You don't need to do this
// every frame.)
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_TEXCOORDINDEX,
0 );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1,
D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,
D3DTOP_MODULATE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_TEXCOORDINDEX,
1 );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG1,
D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLORARG2,
D3DTA_CURRENT );
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,
D3DTOP_MODULATE );
m_WallData.textureCoords[0].lpvData = &m_avWallVertices[0].tuBase;
m_WallData.textureCoords[1].lpvData = &m_avWallVertices[0].tuLightMap; 40
Monochromatic and Color light Maps
// Draw the walls in multi-texture mode.
m_pd3dDevice->SetTexture( 0, D3DTextr_GetSurface("wall.bmp") );
m_pd3dDevice->SetTexture( 1, D3DTextr_GetSurface("lightmap.bmp") );
m_pd3dDevice->DrawPrimitiveStrided( D3DPT_TRIANGLELIST,
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2, &m_WallData, 24,
NULL );
// Draw the floor in single-texture mode.
m_pd3dDevice->SetTexture( 0, D3DTextr_GetSurface("floor.bmp") );
m_pd3dDevice->SetTexture( 1, NULL );
m_pd3dDevice->DrawPrimitiveStrided( D3DPT_TRIANGLELIST,
D3DFVF_XYZ | D3DFVF_DIFFUSE | D3DFVF_TEX2, &m_FloorCielData, 12,
NULL );
// Restore state.
m_pd3dDevice->SetTextureStageState( 1, D3DTSS_COLOROP,
D3DTOP_DISABLE );
41
Diffuse light Maps
// Set the base texture.
dev->SetTexture(0,lpTexureBaseTexture );
// Set up the operation and arguments for the base texture.
dev->SetTextureStageState(0,D3DTSS_COLOROP,
D3DTOP_MODULATE );
dev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE );
dev->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE );
// Set the diffuse light map.
dev->SetTexture(1,lptexDiffuseLightMap );
// // Set the blend stage. //
dev->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_ADD );
dev->SetTextureStageState(1, D3DTSS_COLORARG1,
D3DTA_TEXTURE );
dev->SetTextureStageState(1, D3DTSS_COLORARG2,
D3DTA_CURRENT );
42
Specular light Maps
// Set the base texture.
dev->SetTexture(0, lpTexureBaseTexture);
// Set up the operation and arguments for the base texture.
dev->SetTextureStageState(0, D3DTSS_COLOROP,
D3DTOP_MODULATE);
dev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
dev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);
// Set the specular light map. //
dev->SetTexture(1, lpTexureSpecularLightMap);
// Set the specular light map operation and arguments. //
dev->SetTextureStageState(1, D3DTSS_COLOROP,
D3DTOP_MODULATE);
dev->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);
dev->SetTextureStageState(1, D3DTSS_COLORARG2,
43
Specular light Maps
// Set the color light map. //
dev->SetTexture(2, lpTexureLightMap);
// // Set the color light map operation and arguments.
//
dev->SetTextureStageState(2, D3DTSS_COLOROP, D3DTOP_ADD);
dev->SetTextureStageState(2, D3DTSS_COLORARG1, D3DTA_TEXTURE);
dev->SetTextureStageState(2, D3DTSS_COLORARG2,
D3DTA_CURRENT);
44
Environment Mapping
금속과 같은 반사하는 특성을 지닌 객체의 표현
Spherical Environment Maps




세계를 표현하기 위한 단일 텍스처가 사용.
객체 정점의 텍스처 좌표를 정점의 법선 함수로 계산.
법선이 지역 공간에서 카메라 공간으로 변환되어야 한다.
DirectX SDK 예제 : SphereMap
45
Spherical Environment Maps
HRESULT ApplySphereMapToObject( LPDIRECT3DDEVICE3 pd3dDevice,
dwNumVertices )
D3DVERTEX* pvVertices, DWORD
{
// Get the current world-view matrix.
D3DMATRIX matWorld, matView, matWV;
pd3dDevice->GetTransform( D3DTRANSFORMSTATE_VIEW, &matView );
pd3dDevice->GetTransform( D3DTRANSFORMSTATE_WORLD,
&matWorld );
D3DMath_MatrixMultiply( matWV, matView, matWorld );
// Extract world-view matrix elements for speed.
FLOAT m11 = matWV._11, m21 = matWV._21, m31 = matWV._31;
FLOAT m12 = matWV._12, m22 = matWV._22, m32 = matWV._32;
FLOAT m13 = matWV._13, m23 = matWV._23, m33 = matWV._33;
// Loop through the vertices, transforming each one and
// calculating the correct texture coordinates.
46
for( WORD i = 0; i < dwNumVertices; i++ )
{
FLOAT nx = pvVertices[i].nx;
FLOAT ny = pvVertices[i].ny;
FLOAT nz = pvVertices[i].nz;
// Check the z-component, to skip any vertices that face backward
if( nx*m13 + ny*m23 + nz*m33 > 0.0f )
continue;
// Assign the sphere map's texture coordinates.
pvVertices[i].tu = 0.5f * ( 1.0f + ( nx*m11 + ny*m21 + nz*m31 ) );
pvVertices[i].tv = 0.5f * ( 1.0f - ( nx*m12 + ny*m22 + nz*m32 ) );
}
return S_OK;
}
47
Cubic Environment Maps
구형 맵은 적절한 반사 효과를 생성할 수 있지만, 실
시간으로 생성하기 힘들다.
반사는 구면이 아니라 객체 주변의 가상적인 입방
체로 코딩.
입방체의 한면에 하나씩 텍스처의 그룹으로 생성.
DirectSDK 예제 : EnvCube
48
49