블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (666)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (104)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (218)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total343,311
Today3
Yesterday91

'큐브맵'에 해당되는 글 2건

  1. 2009.12.08 큐브맵의 밉맵생성
  2. 2009.06.25 HDR Cube Map Sample

환경맵핑때문에 만들어둔 큐브맵에 밉맵을 생성해서 사용해야 할 일이생겼다.
msdn에 보니 레벨부분만 0으로 설정해주면 생성이 된다고 하던데....
문제는 생성된 나머지 레벨에는 쓰레기 값만 있다는 거다.
그래서 gpg에서 검색해 보니 아래와 같은 글을 발견했다.

pd3dDevice->CreateTexture( MAP_SIZE, MAP_SIZE, 0, D3DUSAGE_RENDERTARGET|D3DUSAGE_AUTOGENMIPMAP, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT , &g_pShadowTex, NULL);

로 텍스쳐를 생성한 후에
텍스쳐를 렌더타켓으로 설정 후 뭔가를 그린 후에
이 텍스쳐를 어딘가에 사용하기 전에

g_pShadowTex->SetAutoGenFilterType( D3DTEXF_LINEAR );
g_pShadowTex->GenerateMipSubLevels();

이렇게 하면 된단다..
그런데 잘 안된다.
상황이 좀 틀려서 그런가....
그래서 결국 모든 표면의 모든 레벨을 얻어서 표면복사를 해버렸다.
GetCubeMapSurface() 함수로 각 표면을 얻어 D3DXLoadSurfaceFromSurface() 함수로 표면을 복사하면 된다.

아래글은 msdn.

큐브 환경 맵


큐브 환경 맵 (큐브 맵이라고도 부른다)이란, 개체의 주위의 장면(scene)를 개체가 입방체의 중심으로 있는 것 같게 표현한 화면 데이터를 포함한 텍스처이다. 큐브 환경 맵의 각면은, 수평 방향과 수직 방향의 90 번의 시야를 대상으로 해, 1 개의 큐브 맵에는 6 개의 면이 있다. 각면의 방향은, 다음의 그림에 나타내는 대로이다.

중심의 좌표축이 큐브의 면에 대해서 수직의 큐브

입방체의 각면은, 월드 공간의 x/y, y/z, 또는 x/z 평면에 수직에 위치한다. 다음 그림은 각 평면과 면의 대응을 나타내고 있다.

각면에 좌표의 투영이 있는 큐브의 면

큐브 환경 맵은, 일련의 텍스처 개체로서 처리 된다. 애플리케이션에서는, 큐브 환경 맵에 정적인 화면을 사용하거나 큐브 맵의 면에 렌더링을 실시하는 것으로 동적인 환경 맵핑을 실행할 수가 있다. 이 경우, 큐브 맵 표면은 유효한 렌더링 타겟 표면이 아니면 안되어, D3DUSAGE_RENDERTARGET 플래그 세트로 생성 되고 있을 필요가 있다.

큐브 맵의 각면에, 주위의 장면(scene)를 치밀하게 렌더링 할 필요는 없다. 대부분의 경우, 환경 맵은 만곡 표면에 적용된다. 대부분의 애플리케이션으로 사용하는 만곡의 차수가 주어졌다고 하면, 결과적으로 히않고 다 화면이 생성되기 (위해)때문에, 환경 맵의 치밀함은 메모리의 점으로부터도 렌더링의 오버헤드의 점으로부터도 쓸데없게 된다.

큐브 환경 맵의 밉맵화

큐브 환경 맵은 밉맵화할 수 있다. 밉맵화한 큐브 맵을 생성 하려면 ,IDirect3DDevice9::CreateCubeTexture 메서드의 Levels 파라미터를 필요한 레벨수로 설정한다. 이러한 표면의 형상은, 다음의 그림에 나타내게 된다.

n 개의 밉 레벨을 가지는 밉맵화 된 큐브 맵

밉맵화 큐브 환경 맵을 생성 하는 애플리케이션으로 각 표면에 액세스 하려면 ,IDirect3DCubeTexture9::GetCubeMapSurface 메서드를 호출한다. D3DCUBEMAP_FACES 열거형으로부터 적절한 값을 설정해 시작 한다. 이것에 대해서는, 「큐브 환경 맵 표면의 생성」을 참조할것. 다음에,IDirect3DCubeTexture9::GetCubeMapSurfacelevel 파라미터를 목적의 밉맵 레벨로 설정해, 얻어온다 레벨을 선택한다. 0 은 최상정도 화면에 대응하는 것을 생각해 내는 것.

큐브 환경 맵의 텍스처 좌표

큐브 환경 맵을 지시하는 텍스처 좌표는, 표준 텍스처를 적용할 때에 사용하는 단순한 u, v 스타일의 좌표와는 다르다. 실제, 큐브 환경 맵에서는 텍스처 좌표를 사용하지 않는다. 텍스처 좌표 세트 대신에, 큐브 환경 맵에서는 3D 벡터가 필요하다. 적절한 정점 포맷을 지정하는 것이 중요하다. 또, 시스템에 애플리케이션으로 사용하는 텍스처 좌표세트수를 알리는 것 외에도, 각 세트내의 요소수에 대한 정보를 알릴 필요가 있다. Microsoft® Direct3D® 는, 이것을 실시하기 위해서(때문에) 매크로의 D3DFVF_TEXCOORDSIZEn 세트를 준비해 있다. 이러한 매크로에는 파라미터가 1 개 있어, 사이즈를 기술하는 일련의 텍스처 좌표의 인덱스를 식별한다. 3D 벡터의 경우는, D3DFVF_TEXCOORDSIZE3 매크로로 생성 하는 비트 패턴을 포함한다. 다음 코드는, 이 매크로의 사용법을 나타내고 있다.

// Create a flexible vertex format descriptor for a vertex that contains
//   a position, normal, and one set of 3-D texture coordinates.

DWORD dwFVF = D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE3(0); 

디퓨즈 라이트 맵핑등의 경우에는, 벡터에 카메라 공간의 정점 법선을 사용한다. 스펙큐러 환경 맵핑등의 경우에는, 반사 벡터를 사용한다. 변환 끝난 정점 법선에 대해서는 넓게 이해되고 있기 (위해)때문에, 여기에서는 반사 벡터의 계산에 대해 자세하게 설명한다.

독자적으로 반사 벡터를 계산하려면 , 각 정점의 위치 좌표와 뷰포트로부터 그 정점에의 벡터를 알고 있을 필요가 있다. Direct3D 에서는 지오메트리의 반사 벡터를 자동적으로 계산할 수 있다. 이 기능을 사용하면, 환경 맵의 텍스처 좌표를 포함할 필요가 없기 때문에, 메모리를 절약할 수 있다. 게다가 대역폭이 감소해, TnLHAL 장치의 경우는, 애플리케이션으로 독자적으로 계산하는 것 보다 훨씬 빠르게 계산을 실행할 수 있다. 이 기능을 이용하려면 , 큐브 환경 맵을 포함한 텍스처 스테이지에 있어,D3DTSS_TEXCOORDINDEX 텍스처 스테이지 스테이트를,D3DTEXTURESTAGESTATETYPE 의 D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 멤버의 편성과 텍스처 좌표 세트의 인덱스로 설정한다. 디퓨즈 라이트 맵핑의 경우등에는,D3DTEXTURESTAGESTATETYPE 의 D3DTSS_TCI_CAMERASPACENORMAL 멤버를 사용해, 시스템에 카메라 공간의 변환이 끝난 정점 법선을 텍스처의 어드레싱베크톨로서 사용하는 것을 알릴 수가 있다. 인덱스는, 시스템이 텍스처의 랩핑 모드를 결정하기 위해서만 사용한다.

다음 코드는, 이 값의 사용법을 나타내고 있다.

// The m_d3dDevice variable is a valid pointer
// to an IDirect3DDevice9 interface.

// Automatically generate texture coordinates for stage 2.
// This assumes that stage 2 is assigned a cube map.
// Use the wrap mode from the texture coordinate set at index 1.

m_d3dDevice->SetTextureStageState( 2, D3DTSS_TEXCOORDINDEX,
                                   D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR | 1); 

자동 텍스처 좌표 생성을 유효하게 하면, 2 개의 공식의 어느쪽이든을 사용해 각 정점의 반사 벡터가 계산된다. D3DRS_LOCALVIEWER 렌더링 스테이트를 TRUE 로 설정 하면, 다음 공식이 사용된다.

R = 2(ExN)N-E

이 공식에서는,R 는 계산하는 반사 벡터,E 는 위치 좌표로부터 시점까지의 정규화된 벡터,N 는 카메라 공간의 정점 법선이다.

D3DRS_LOCALVIEWER 렌더링 스테이트를 FALSE 로 설정 하면, 다음 공식이 사용된다.

R = 2NzN-I

이 공식에서는,RN 요소에 대해서는 전의 공식과 같다. NZ 요소는 정점 법선의 월드 공간 z,I 는 무한대 거리에 있는 시점의 벡터 (0,0,1)이다. 시스템에서는, 몇개의 공식에서 요구한 반사 벡터를 사용해, 큐브 맵의 적절한 표면을 선택 및 처리한다.

  대부분의 경우, 애플리케이션에서는 정점 법선의 자동 정규화를 유효하게 할 필요가 있다. 이것을 유효하게 하려면 ,D3DRS_NORMALIZENORMALS 를 TRUE 로 설정한다. 이 렌더링 스테이트를 유효하게 하고 있지 않는 경우, 환경 맵의 외관이 기대와는 크게 다른 것이 된다.

더 자세한 정보는, 다음 주제를 참조할것.

'Study > Directx 9' 카테고리의 다른 글

비디오 메모리, 시스템 메모리 체크하는법  (0) 2010.05.31
D3D10 resource usage.  (0) 2009.12.16
큐브맵의 밉맵생성  (0) 2009.12.08
cbuffer  (0) 2009.11.15
D3DXMatrixLookAtLH  (0) 2009.10.26
알파블렌드와 알파테스트  (0) 2009.09.02
Posted by 붕대마음

댓글을 달아 주세요


이 예제는 부동소수점 텍스쳐와 높은 동적 범위의 광원과 함께 입방체 환경 맵핑에 대해 말한다.
d3d9에서 텍스쳐를 위해서 부동소수점 포맷이 유용하다.
이 포맷은 빛이 재질에 흡수되는 부분에서 환경맵핑이 된 매시의 좀 더
사실적인 빛 효과를 만들수 있게 하기 위해 1.0보다 큰 색상값을 저장할 수 있도록 한다.

Sample Overview
이 샘플은 두가지의 랜더링 기술(입방체 환경맵핑과 높은 동적 범위 광원)을 보여준다.
1. 입방체 환경맵핑
- 입방체 환경 맵핑은 큐브텍스쳐맵 내부의 하나의 3D 물체의 환경 주위에서 랜더링 되는 기술로서
  해당 물체는 빛이 가미된 효과를 만들기 위해 강한 빛을 계산하는데 메모리를 소모하지 않고
  큐브맵을 사용할 수 있다.

2. HDR
- 높은 동적 범위(HDR) 광원은 부동동소수점 텍스쳐들과 강한 빛들을 통해을 사용하여 높은 컬리티의
  빛효과를 만들어 표현하는 기술이다.
  부동 소수점 텍스쳐 포맷은 d3d0에 소개되어져 있다.
  전통적인 integer포맷 텍스쳐와는 달리 부동 소수점 텍스쳐들은 넓은 범위의 색상값들을 저장할 수 있다.
  그래서 부동소수점 텍스쳐에서의 색상값들은 0~1사이로 클램프된 값을 얻지  않고 실세계에서
  좀 더 빛과 같은 텍스쳐를 사용하여 현실성을 사용할 수 있다.

  HDRCubeMap 몇몇  해당 물체를 다른 주위의 오브젝트들로 환경을 구성하여 장면을 그린다.
  해당 물체는 반사력을 0~1로 조절하여 설정할 수 있고, 0은 빛을 완전히 흡수한다는 뜻이며 1은
  흡수없이 모든 빛을 반사한다는 뜻이다.
  빛들은 장면에서 네개의 점광원으로 구성되어지고 사용자에 의해 가감을 조절할 수 있다.

Implementation
아래와 같은 것으로 장면을 구성할 수 있다.
1. 벽들과 바닥, 천장을 포함하는 하나의 room mesh
2. 빛의 방향을 표시하는 네개의 작은 구 메시들
3. 환경맵을 적용된 room의 중앙에 위치한 단일 mesh
4. 두개의 비행 mesh. 이들의 궤도는 환경매핑된 mesh의 주위를 돌며 환경맵에 반사되어진다.
   이들은 시각적으로 환경맵이 동적이고 주위환경의 변화에 따라 바뀐다는 것을 보여준다.

샘플을 로드하면 두개의 입방체 텍스쳐가 생성되어져 있고 하나는 A8R8G8B8 포맷이며 다른 하나는 A16B16G16R16F 포맷이다.
랜더링시 사용자의 선택에근거하여 환경맵을 구성한다.
이 샘플은 HDR빛을 사용할 시 정수와 부동소수점 텍스쳐 사이의 다른점을 보여준다.
스텐실 표면과 동일한 크기의 큐브텍스쳐 표면또한 생성되어 진다.
카메라는 CModelViwerCamera을 쓴다.
이 카메라는 항상 원점(환경매핑된 mesh)을 바라본다.
사용자는 카메라의 위치를 mesh주위로 이동하거나 회전할수 있다.
카메라는 환경매핑된 메시의 world 행렬뿐 아니라view와 projection 행렬에 의해서도 계산되어져 랜더링 된다.

The Rendering Code
세계의 핵심 함수 : RenderSceneIntoCubeMap, Render, RenderScene
                          그리고 vs와 ps.

RenderScene은 현재 렌더타겟의 장면을 실제로 렌더링 한다.
이 함수는 큐브텍스쳐와 디바이스 백버퍼에서의 장면 렌더 두 곳에서 호출되어 진다.
세개의 인자(뷰행렬, 프로젝션행렬, 환경매핑으로 그려질 것인지의 여부 플래그)를 받는다.
bool 플래그가 필요한 이유는 환경맵일 경우에는 환경매핑된 메쉬는 그려지지 않기 때문이다.
나머지 함수들은 그대로 하면 된다.
만약 처음이라면 뷰 공간의 빛의 위치뿐 아니라 가장 최근에 변환된 행렬들과 effec 오브젝트들을 업데이트 한다.
그러고 나서 장면에 있는 모든 오브젝트들을 각각에 연결된 테크닉으로 렌더링 한다.

RenderSceneIntoCubeMap은 전체 장면을 큐브텍스쳐에 랜더링 한다.
처음으로 현재 랜더 타겟과 스텐실 버퍼를 저장하고 스텐실버퍼 디바이스로서 큐브텍스쳐를 위해 스텐실 서페이스를 설정한다.
다음으로 여섯개의 면을 되풀이 한다.
각 면은 랜더타겟으로 면 서페이스를 설정한다.
그런 다음에   특별한 면, 큐브면에서 정점을 향하고 있는 카메라를 사용하기 위해 뷰 행렬을 계산한다.
그 후에는 false로 지정한  bRenderEnvMappedMesh 인자, 뷰와 프로젝션행렬과 함께 RenderScene함수를 호출한다.
이 프로젝션 행렬은 90도 각도의 뷰와 1도의 비율을의 하나의 정사각형을 가진다.  
여섯면 모두 처리가 끝난고, 이전 렌더타겟과 스텐실 버퍼를 복구시킨다.
현재 프레임을 위한 환경맵이 다 만들어 졌다.

Render는 최상위 렌더링 함수로서 매프레임마다 DXUT에 의해 불려진다.
처음으로 카메라 오브젝트를 갱신을 위해 FrameMove를 호출하여 카메라에 의해 업데이트하여 관리되어 진다.
다음으로 해당프레임에서 환경을 반사시키는 큐브텍스쳐를 구성하기 위해 RenderSceneIntoCubeMap를 호출한다.
그 후에 카메라로 부터의 뷰,프로젝션 행렬과 함께 RenderScene를 호출하여 장면을 그리고 bRenderEnvMappedMesh가
true로 설정된다.

The Shader
ss






참고 : http://en.wikipedia.org/wiki/High_dynamic_range_rendering

'Study > Graphics' 카테고리의 다른 글

not use lock, unlock version font system  (0) 2009.08.24
shader에서의 dword  (0) 2009.08.15
float4에 마지막 w의 값...1이냐 0이냐....  (0) 2009.08.11
shader SetValue  (0) 2009.08.08
Directx9 셰이더 프로그래밍 예제 수정방법.  (4) 2009.07.13
HDR Cube Map Sample  (0) 2009.06.25
Posted by 붕대마음

댓글을 달아 주세요

최근에 달린 댓글

최근에 받은 트랙백

글 보관함