Search Results for '3D Programming/Rendering'

3 POSTS

  1. 2007/06/03 라이트와 관련된 글
  2. 2007/05/29 알파 블랜딩 + 알파 테스트로 나무그리기
  3. 2007/05/20 알파 서브셋 메시 렌더링 정책

라이트와 관련된 글

Posted 2007/06/03 12:26, Filed under: 3D Programming/Rendering


GPG 에서 글을 검색하던 중 아차 싶은 글이 눈에 띄었다.

일반적으로 "라이트" 라는 단어를 생각하면, 많은 사람들은 다음과 같이 생각합니다.

빛이 받는 부분은 밝아지고, (백색에 가까워진다.)
빛이 받지 않는 부분은 어두워진다 (검정색에 가까워진다.)

CG 홍보물이나 3D Studio MAX 의 라이트에 익숙한 개념인데.

하지만 Direct3D 의 기본 라이트로 위와 같은 너무 당연한 라이트를 구현하는것이 애매하네요.


1. MODULATE
MODULATE 는 곱셈입니다. 한가지 재미있는 사실이 많은 사람들이 곱셈이기 때문에
곱하면 곱할수록 숫자가 커진다고 생각하지만, 곱하면 곱할수록 숫자가 작아집니다.
0~1 사이값의 계산이기 때문에 빛이 최대로 받아야만 기본텍스춰의 색이 유지가 됩니다.

기본텍스춰보다 밝아지는경우는 없으며 오직 음영만 생깁니다.


2. ADD
ADD 는 덧셈입니다. 이 모드를 사용하면 밝아지는것까지는 가능하지만,
어두워지는것이 안됩니다. 사정없이 밝아지기만 하기 때문에
음영이 없습니다.

게다가 어떤존재가 "밝다" 고 느끼는것은 "실제 그 물체가 밝은것이 아니라 어두운부분과의 경계차가 심하다" 인데, 덧셈식의 특성상 모든 부분에 골고루 밝아지기 때문에

빛이 받았다기 보다는 "밀가루가 뿌려졌다" 로 느껴집니다.

3. 스펙큘러

스펙큘러의 경우 ADD 와 다를것이 없습니다. 단지 카메라에 영향을 받는다는 특성(장점도 단점도 아님). 이 있을뿐입니다.


4. ADD_SIGNED, ADD_SIGNED2X
아직까지 제가 사용해본적은 없습니다면,
공식 자체로는 "밝아진것과 어두워진것" 을 모두 표현할수 있습니다.


5. MODULATE2X

"밝아진것과 어두워진것" 을 나타내는 가장 나은방법중 하나입니다. 라이트컬러 0.5 를 기점으로 "밝아지는것 과 어두워지는것" 이 결정되며 또한 콘트라스트가 증가되어 보이는 부수적인 효과가 있습니다.

제가 그나마 가장 추천하고 싶은 방법입니다.
단점은 AMBIENT 값을 잘 조정해야 한다는점 정도.



출처 : http://www.gpgstudy.com/forum/viewtopic.php?t=4065&highlight=%BE%EE%B5%CE%BF%F6%C1%F6%B4%C2
작성자 : 심 형근


Leave a comment


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


Self Alpha Blending
*. 모델중 알파텍스처 포함 모델의 경우
: 캐랙터 모델에서조차 섬세한 모양의 부분은 매쉬형태가 아닌 단순한 평면에 알파 텍스쳐를 입히는
경우가 있다. (머리카락등의 경우)

a. 정상적인 렌더링의 경우
평면이 그대로 랜더링 되기때문에, 평면그대로가 묘사된다.

b. 알파블랜딩을 설정한 경우
모델내에서도 z값에 의해 뒷면이 잘려나가 안면등이 제대로 렌더링 되지 않을 수 있다.

c. 서브셋 정렬 + 알파블랜딩
알파텍스쳐 포함 서브셋과 그외 서브셋을 분리하여, 알파텍스쳐가 없는 서브셋을 먼저그린 후,
알파텍스쳐 포함 서브셋을 나중에 렌더링한다.
앞머리와 뒷머리가 모두 알파텍스쳐인 경우, 이 알파면이 겹치는 부분이 제대로 렌더링 되지 않는다.

d. 서브셋 정렬 + 알파 서브셋 카메라 정렬(거리) + 알파블랜딩
가장 완벽한 방법이나, 한 모델을 렌더링하는데 그 비용이 너무 많이 소요된다.


e. 서브셋 정렬 + 알파블랜딩 + ZWrite OFF + CULLMODE NONE
알파없는 서브셋을 먼저 그린후, Zwrite를 Off한다음 알파 서브셋을 렌더링한다.
알파면이 겹칠수 있으나, 적절한 결과물을 출력할 수 있다.

f. 알파블랜딩 + 알파테스트
알파테스트의 경우 가장자리가 두드러지게 잘려나가지만, 이 가장자리를 알파브랜딩
이 보완하는 방법이다. 알파면이 적을경우 이 방법도 좋을것 같다.

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 대한민국 라이센스에 따라 이용하실 수 있습니다.