1. 알파블랜딩

m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
m_pDevice->SetRenderState( D3DRS_SRCBLENDD3DBLEND_SRCALPHA );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );


사용자 삽입 이미지

오른쪽처럼 뒤쪽에 있는 매쉬부터 그려오면 문제가 없지만, 왼쪽그림처럼 앞쪽이 먼저그려진다면,
치명적인 결과를 불러 일으킨다!! ㅜ_ㅜ.




2. 알파테스트

m_pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_pDevice->SetRenderState( D3DRS_ALPHAREF,        0x08 );
m_pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );


사용자 삽입 이미지

알파블랜딩처럼 치명적인 위험은 전혀 없지만, 나무 가장자리가 도트수준으로 잘려 두드러져 보인다.
알파채널값은 0x08 로 설정되었고, 이값보다 크거나 같으면 텍셀을 출력하게 된다.


3. 알파블랜딩 + 알파테스트

m_pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE );
m_pDevice->SetRenderState( D3DRS_SRCBLENDD3DBLEND_SRCALPHA );
m_pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_pDevice->SetRenderState( D3DRS_ALPHAREF,        0x08 );
m_pDevice->SetRenderState( D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL );

사용자 삽입 이미지


사용자 삽입 이미지

정렬을 신경쓰지 않고 적절히 출력할수 있는 방법이나, 알파테스트로 잘려나가지 않은 부분에선(알파블랜딩)
위그림처럼 보는시점에 따라서 가장자리가 지저분해질 수 있다.



간단한 알파 데모

Leave a comment

빛의 색

Posted 2007/05/20 20:31, Filed under: 3D Programming/Shader
사용자 삽입 이미지
빛은 각기 다른 색 온도를 가지고 있습니다. 색 온도란 빛의 색감을 수치로 표현한 것으로 캘빈 온도(K) 라는 단위를 사용합니다.

보통 한낮의 태양광은 5500K의 색 온도 를 가지고 있으며 같은 태양광이라 하더라도 아침이나 저녁때의 색 온도는 한낮에 비해 낮습니다. 색 온도가 높을수록 파란색을 띠게 되며 낮을수록 붉은 색을 띠게 됩니다. 아울러 또 다른 광원인 형광등, 백열등, 촛불 등도 각기 다른 색 온도를 가지고 있습니다.

출처 : http://www.webmani.com/

Leave a comment

고러드 & 퐁 쉐이딩 용어 설명

Posted 2007/05/17 18:40, Filed under: 3D Programming/Shader
사용자 삽입 이미지사용자 삽입 이미지
고러드 쉐이딩
플렛 쉐이딩의 단점을 보완한 것으로 빛이 비춰지는 면들의 평균적인 명암을 계산해서 그것을 부드럽게 적용시켜주는 것으로 플렛 쉐이딩과는 달리 면과 면사이의 각을 감추어 준다.

이것은 좀더 부드러운 면을 만들어 주기는 하지만 명암이 평이해져 버리기 때문에 잘 사용하지 않으면 단조로운 이미지가 생성된다


고러드 쉐이딩(Gouraud Shading)
고러드 쉐이딩은 플랫 쉐이딩보다 약간 진보된 기술이다. 플랫 쉐이딩이 단지 하나의 라이트 값으로 전체 폴리곤을 적용하는 반면에 고러드 쉐이딩은 폴리곤의 각 위치에 고유 라이트 값을 주면서 폴리곤의 표면 전반에 부드럽게 평균적인 값을 줌으로서 3D 오브젝트에 더 많은 라이트 효과를 준다. 라이트 소스와 플랫 쉐이딩을 참고하라.

  이름에서 볼 수 있듯이 이는 한번에 세 꼭지점중 두 개의 색상 보정을 제안한 Gouraud에 의해 고안된 방법이다. 이 방법은 가중 평균을 사용하여 생성된 두 꼭지점 사이의 가장자리를 따라 색상을 결정하게 된다. 가중치는 선의 양끝을 계산하여 얻어진 점으로 부터의 거리에 대한 비율로 정해지게 된다. 또한, 색상 보정은 모서리상의 점 색상이 계산된후 전체 삼각형을 채우는데 적용된다.

ㄱ.인접 다각형들간의 표면 노말을 평균 계산하여 색상을 채우는 것
ㄴ.인접면 사이의 색상이 단계적 표현, 경계가 부드럽다



퐁 쉐이딩( Phong Shading )
고러드 쉐이딩에서는 하이라이트나 반사광을 표현할 수 없는데 이것을 가능하게 해주는 쉐이딩 기법. 이 기법은 사실 상당히 복잡한 계산이 필요하지만 게임에서 사용되는 것은 약간의 편법. 게임에서는 퐁 쉐이딩이 적용될 명암 단계를 미리 이미지화 해놓고 면의 각에 따라 만들어 둔 이미지 중 필요한 부분만을 사용. 원리 상으로는 고러드 쉐이딩 보다 2배정도 느리지만 효과는 대단하다.


Phong Shading 역시 Phong에 의해 제안된 방법으로 꼭지점 벡터 역시 전체 삼각형 내에서 보정되어지는 방법이다. 퐁 쉐이딩된 삼각형 내의 모든 점은 그 표면 표준 벡터의 방향으로 벡터의 방향을 이루게 된다. 그러므로, 조명 과정을 통해 삼각형 내의 모든 점들이 보다 정확한 색상을 가질 수 있도록 해준다.

ㄱ.고로드 셰이딩과 유사
ㄴ.정점들 사이의 표면 노말들을 하나의 표면 노말로 분해하여 면의 모든 픽셀에 대한 노말을 계산
ㄷ.고로드 셰이딩보다 정확한 곡면 셰이딩 가능
ㄹ.보다 사실적으로 표현 가능
ㅁ.3차원 물체의 셰이딩 기법으로 많이 사용
ㅂ.랜더링속도

출처 : http://cglink.co.kr/

Leave a comment

[DX] 3D 프로그래밍 기초상식

Posted 2007/04/16 18:38, Filed under: 3D Programming/Graphics
일반적으로 수학에서는

v' = M * v 이다.

v는 4x1 벡터고 M은 4x4 행렬이기 때문이다.

그러나 DX에서는 1x4 벡터를 쓰기 때문에,

v' = v * M

식이 된다.



v' = v * M1

v'' = v' * M2

v''' = v'' * M3

의 식은

v''' = v * M1 * M2 * M3

로 나타낼수 있다.

또한

Mt = M1 * M2 * M3
v''' = v * Mt

로 나타낼수 있고 Mt의 연산은 순서대로 이루어져야 된다.

Homogeneous coordinates

4차원이지만 3차원 벡터처럼 쓰이는 것...

3차원 벡터 -> 4차원 벡터

( x, y, z ) -> ( x, y, z, 1.0f )

4차원 벡터 -> 3차원 벡터

( x, y, z, w ) -> ( x/w, y/w, z/w )

Leave a comment

RHW(Reciprocal Homogeneous W)란?

Posted 2007/04/16 18:33, Filed under: 3D Programming/Graphics
copyrightⓒ 김성완(찐빵귀신) [2001년 7월 23일]

W는 Homogeneous coordinates의 네번째 성분이고 homogeneous coordinates 는 우리말로 동치 좌표라고 합니다. 일반적으로 3차원 좌표변환 행렬로 4*4 행렬을 사용하는데.. 그렇게 되면 버텍스 좌표계 값은 (x,y,z,1)로 사용합니다.

perspective 변환 행렬을 적용하고 나면 버텍스 좌표값의 네번째 성분이 1이 아닌 값이 나오게 되는데.. 이렇게 얻어지는 좌표값을 보통 (x,y,z,w)라고 표시합니다.

이때 이런 좌표값을 동치 좌표라고 합니다. 실제로 스크린상의 좌표값으로 사용하기 위해서는 동치좌표가 아닌 일반적인 좌표로 변환을 해야 하는데.. 좌표의 각성분을 w로 나누어서 구하게 됩니다. 즉, (x/w, y/w, z/w, w/w) = (x/w, y/w, z/w, 1) 이 되고 네째 성분 값이 1인 일반적인 좌표로 바뀌죠.

rhw라고 하는 것은 reciprocal homogeneous w 의 약자로 동치좌표 'w의 역수' 라는 뜻입니다. 즉, 1/w 를 말하죠. 위에서 동치좌표를 일반적인 좌표로 변환하기 위해서 w로 나누었는데, 컴퓨터에서는 나누기 계산이 느리므로 1/w를 한번만 구해서 각성분에다 1/w를 곱하는 식으로 계산을 처리합니다.

그래서 direct3d에서는 w의 역수를 rhw라고 이름하고 따로 저장하는 거죠.

그런데 직접 행렬 변환을 처리할 목적이 아니라면 이런 부분은 굳이 알지 못하더라도 물체의 좌표를 담은 오브젝트 좌표값만 넘겨주면 위에서 언급한 계산들은 세팅해준 행렬에 따라 자동으로 알아서 처리해주므로 신경쓰지 않아도 됩니다. 좌표변환의 전과정을 직접 처리할게 아니라면 rhw는 크게 신경쓰지 않아도 됩니다. 그냥 변환 행렬만 제대로 세팅하면 되지요.

Leave a comment


Recent Posts

  1. [참고자료] 모니터 해상도 도표
  2. [런타임에러] Expression: map/set it..
  3. *. 플러그인 랩퍼 사용하기 ( 3DS MAX..
  4. *. 스키닝 오프셋 벡터 [Offset Vecto..
  5. November 2007 DirectX SDK News

Recent Comments

  1. 관리자만 볼 수 있는 댓글입니다. 06/24

Recent Trackbacks

Calendar

«   2009/11   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

  1. Cafe24
  2. ForTheProgramming
  3. Tatter Tools
  4. 근석이
  5. 진호네

Site Stats

TOTAL 14477 HIT
TODAY 4 HIT
YESTERDAY 16 HIT
Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-동일조건변경허락 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.