반응형

칼라키로 뺀다
  * 텍스쳐 생성시 칼러키를 지정하여 빼기

D3DCOLOR ColorKey = D3DCOLOR_XRGB(255,0,255);
D3DXCreateTextureFromFileEx( DXD9, 이름,  크기, 크기, 1, NULL,텍스쳐포맷, 메모리풀, 필터, 필터, ColorKey, NULL, NULL, 텍스쳐포인터);


픽셀에 투명값이 있다
  * 포토샵에서 저장시 알파채널을 포함해서 저장
  * TGA, PNG, DDS등의 포맷을 사용
  * SetRenderState에 알파를 사용한다는 옵션을 선택

m_pD3dD9->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE);
m_pD3dD9->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
m_pD3dD9->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);



SetTextureStage에서 FACTOR로 투명도를 조절한다
  * 이미지가 가지고 있는 알파값에 다시 알파값을 조정할수 있다.
  * 픽셀칼러(RGB) * 픽셀알파값(100%로계산) * 원하는 알파값(100%로계산)

m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_TFACTOR);
m_pD3dD9->SetRenderState( D3DRS_TEXTUREFACTOR, D3DCOLOR_ARGB( 원하는 알파값, 255, 255, 255 ) );



정점의 알파값을 사용한다
  * 정점의 칼라가 ARGB를 사용할경우 0xffffffff인데
  * 맨앞의 ff값을 수정해주면, 채워지는 face의알파도 영향을 받는다.
  * 픽셀칼러(RGB) * 픽셀알파값(100%로계산) * 정점알파값(100%로계산)

m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);

m_pD3dD9->SetTextureStageState( 0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

 

 

 

 

 

 


http://www.silverwolf.co.kr/4886

 

 

[알파합성]

 

2번 렌더링을 실시하는 , 이른바 투패스 라고 부르는 방법으로 알파 합성(알파 블렌딩) 을 의미 알파 합성이란 폴리곤을 렌더링할때, 폴리곤 색을 그냥 출력하는 것이 아니라 이미 렌더링 된 화면에 여러가지 합성을 해서 출력하는 방법이다. 

알파합성은 현재 그려져 있는 색과 렌더링하는 폴리곤의 색을 합성한다. 따라서 , 반투명 폴리곤을 렌더링하기 전에 불투명 오브젝트를 렌더링 하여야 한다.   

깊이 테스트를 하면서 렌더링 할 경우 , 렌더링 순서를 잘못하면 반 투명 폴리곤의 한쪽 부분은 오브젝트가 렌더링 되지 않고, 마술처럼 오브젝트의 일부분이 사라진 화면이 출력되게 됨. 

------------------------------------------------------------------------------------- 

반투명 on : 디바이스->SetRenderState(D3DRS_ALPHABLENDABLE , TRUE); 
반투명 OFF : 디바이스->SetRenderState(D3DRS_ALPHABLENDABLE , FLASE); 

------------------------------------------------------------------------------------- 
합성 설정 방법 : 디바이스->SetRenderState(D3DRS_BLENDOP , 값) 

D3DBLENDOP_ADD 
                          최종색 = A * 렌더링할 폴리곤 색 + B * 이미 렌더링 된 색 

D3DBLENDOP_SUBTRACT 
                          최종색 = A * 렌더링할 폴리곤 색 - B * 이미 렌더링 된 색 

D3DBLENDOP_REVSUBTRACT 
                          최종색 = -A * 렌더링할 폴리곤 색 + B * 이미 렌더링 된 색 

D3DBELNDOP_MIN 
                         최종색 = 작은값(A * 렌더링할 폴리곤 색 , B * 이미 렌더링 된 색) 

D3DBELNDOP_MAX 
                         최종색 = 큰값(A * 렌더링할 폴리곤 색 , B * 이미 렌더링 된 색) 

-------------------------------------------------------------------------------------- 
아무 것도 설정되지 않았을때는 D3DBLENDOP_ADD 가 사용되며 , D3DBLENDOP_ADD 는 색을 서로 더한다. 

합성 강도 또한 SetRenderState 로 설정한다. 
이제부터 렌더링 하려는 폴리곤의 합성 강도 
디바이스->SetRenderState(D3DRS_SRCDBLEND , 값A) 

이미 렌더링 된 렌더일 타겟 색의 합성 강도 
디바이스->SetRenderState(D3DRS_DESTBLEND , 값B) 

--------------------------------------------------------------------------------------- 
<다양한 합성 방법> 

1. 선형 합성 

이른바 , 알파 합성이라 부르는 합성방법입니다. 이미 그려진 색과 지금부터 렌더링 하려고 하는 폴리곤의 색을 다음과 같은 비율로 합성합니다. 

최종색 = (1 - a) * 바닥색 * a * 덮일색. 

// 선형합성 C = Cd(1-As)+CsAs 
RS(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); 
RS(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 

--------------------------------------------------------------------------------------- 
덧셈 합성 

이합성은 바닥색의 변함없이 폴리곤의 색을 위에 겹칩니다. 

최종색 = 바닥색 + a * 덮일색 

a의 값이 커지는 것 만큼 , 위에 그려지는 폴리곤을 강하게 합성한다. 

RS(D3DRS_DESTBLEND, D3DBLEND_ONE); 
RS(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 

이상의 합성은 빛의 표현에 많이 사용, GLARE 효과. 

--------------------------------------------------------------------------------------- 

뺄셈 합성 

최종색 = 바닥색 - a* 덮일색 

// 뺄셈합성 C = Cd-CsAs 
RS(D3DRS_BLENDOP, D3DBLENDOP_REVSUBTRACT); 
RS(D3DRS_DESTBLEND, D3DBLEND_ONE); 
RS(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); 

이 합성 방법은 그림자 표현에 사용됨. 

뺄셈 합성을 하는 폴리곤을 여러번 거듭해나가면, 마지막에는 까맣게 된다. 
---------------------------------------------------------------------------------------- 
곱셈 합성 

최종색 = 바닥색 * 덮일색 

// 곱셈합성 C = Cd*Cs 
RS(D3DRS_DESTBLEND, D3DBLEND_SRCCOLOR); 
RS(D3DRS_SRCBLEND, D3DBLEND_ZERO); 
---------------------------------------------------------------------------------------- 

제곱 합성 

어두운곳은 더 어둡게 하고, 밝은 곳은 그대로 표시함. 이를 식으로 표현하면 다음과 같음. 

최종색 = 바닥색 * 바닥색 

바닥색을 제곱해서 색의 채도를 강조함. 제곱 합성은 렌더링 하는 폴리곤의 색이나 알파 값에 영향을 받지 않기 때문에, 폴리곤을 입혀 렌더링해도 텍스쳐는 효과를 미치지 않음. 

RS(D3DRS_DESTBLEND, D3DBLEND_DESTCOLOR); 
RS(D3DRS_SRCBLEND, D3DBLEND_ZERO); 

---------------------------------------------------------------------------------------- 
네거티브 포지티브 반전 

흰 폴리곤을 렌더링하면, 검은 부분은 희게, 흰 부분은 검게 출려되도록 색을 역전하는 변환을 합니다. 

최종색 = ( 1 - 바닥색) * 덮일색 

RS(D3DRS_DESTBLEND, D3DBLEND_ZERO); 
RS(D3DRS_SRCBLEND, D3DBLEND_INVDESTCOLOR); 
---------------------------------------------------------------------------------------- 

불투명 

알파블렌딩을 설정한 채로 불투명한 것을 그리고 싶을때 

최종색 = 덮일색 

RS(D3DRS_DESTBLEND, D3DBLEND_ZERO); 
RS(D3DRS_SRCBLEND, D3DBLEND_ONE); 

 
 
 
 
 
D3DRS_ALPHATESTENABLE // 알파테스트 사용 유/무 디폴트: FALSE 
D3DRS_ALPHAREF // 시험 픽셀값 0x00 ~ 0xff 
D3DRS_ALPHAFUNC // D3DCMPFUNC에 대한 정의 디폴트: D3DCMP_ALWAYS 

D3DCMPFUNC 

D3DCMP_NEVER 항상시험에 실패한다. 
D3DCMP_LESS 시험 픽셀이 현재의 픽셀보다 작은 경우 통과한다. 
D3DCMP_EQUAL 시험 픽셀이 현재의 픽셀과 동일한 경우 통과한다. 
D3DCMP_LESSEQUAL 시험 픽셀이 현재의 픽셀보다 작거나 같은 경우 통과한다. 
D3DCMP_GREATER 시험 픽셀이 현재의 픽셀보다 큰 경우 통과한다. 
D3DCMP_NOTEQUAL 시험 픽셀이 현재와 같지 않은 경우 통과 한다. 
D3DCMP_GREATEREQUAL 시험 픽셀이 현재보다 크거나 같은 경우 통과한다. 
D3DCMP_ALWAYS 항상 시험에 통과한다. 


# 시험 픽셀은 D3DRS_ALPHAREF의 값이며 현재 픽셀은 출력될때 이미지의 알파픽셀의 값을 의미 합니다. 

# 시험에서 통과하지 않을경우는 그에 해당하는 현재픽셀은 무시하게 되어 출력하지 않습니다. 

통과 했을 경우는 현재픽셀의 알파값을 가지고 출력하게 됩니다. ( 말 그대로 알파 비교를 하게 되겠지여 ) 

알파 테스트는 픽셀에 들어있는 알파값을 비교해서 이 픽셀을 사용할것인지 안할것인지를 결정하게 되는 겁니다. 

이것을 잘만 사용하면 스프라이트 형식의 1555 포맷과 같은 이미지 형식이라면 알파소팅을 하지 않아도 됩니다. 

P.S 알파 테스트를 하는 목적중에 하나는 렌더링 속도를 올리기 위해서 입니다. 

이미지에서 알파를 사용하면 자신의 위치에서 뒤에 있는 이미지의 픽셀을 혼합해서 나오게 되는데 

알파테스트는 불필요한 혼합을 하지 않아도 되므로 속도 향상을 줄수가 있는 겁니다. 

설명이 제대로 됬는지 모르겠군여 틀린부분 있으면 질문&답변게시판에 지적해 주세여 
----------------------------------------------- 

벌날개의 메모... 
<알파채널이 있는 경우...(TGA)> 
텍스처 로드...(초기화에서) 
if( FAILED( D3DUtil_CreateTexture( g_pd3dDevice,"tree01s.tga", 
                                           &g_pTexture ) ) ) 
            return E_FAIL; 
(랜더링에서) 
g_pd3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE,   TRUE ); 
g_pd3dDevice->SetRenderState( D3DRS_SRCBLEND,  D3DBLEND_SRCALPHA ); 
g_pd3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA ); 

랜더링..... 

 
 
 
 
텍스쳐 알파 채널을 이용한 투명 표현
 

// 선형합성 C = Cd(1-As)+CsAs

theApp.m_pDev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
theApp.m_pDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA ); 
theApp.m_pDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );


블렌딩이 안되는건 텍스쳐 파일에 알파채널 값이 없기 때문이였다. -_-!


그리고 그 전에 컬러끼리 섞었는데 그 결과는 좀 진한 투명 색이였다.

두 색이 합쳐진건지 원.. ㅋ

theApp.m_pDev->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
theApp.m_pDev->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCCOLOR ); 
theApp.m_pDev->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVDESTCOLOR );





알파 블렌딩에 관하여


눈에는 보이지 않는...일종의 색상들을 섞을때 파라메터로 사용되는...그런 '값'이죠.

예를 들어 D3D의 알파블렌딩은 아래와 같이 이루어집니다.

WriteColor = SrcBlend * SrcColor + DstBlend * DstColor ;

WriteColor : 화면에 찍고자 하는 색상
SrcColor  : 텍스쳐 블렌딩(쉐이딩,멀티텍스쳐링 따위...)처리된 텍스쳐색상
DstColor  : 현재 화면에 찍혀있는 색상

SrcBlend와 DstBlend를 적당히 잘 만들어 주면 재미있는 효과를 얻을수 있습니다.

SrcBlend = 1  DstBlend = 0 
그냥 색상을 찍음.

SrcBlend = 0  DstBlend = 1 
아무색상도 찍지 않음.

SrcBlend = SrcAlpha  DstBlend = 1-SrcAlpha 
SrcColor에 있는 알파값으로 블렌딩.
( 만약 모든 SrcAlpha값이 0.5 라면  반반씩 섞이는 셈이니...정말로 반.투.명)

SrcBlend = 1  DstBlend = 1
SrcColor와 DstColor를 그냥 더해서 찍음.
텍스쳐가 찍히는 곳은 원래 찍혀있던 색상보다 밝아집니다. 눈부시게 빛나는(광원)효과.

SrcBlend = 0  DstBlend = SrcColor
SrcColor와 DstColor를 그냥 곱해서 찍음.
텍스쳐의 색상으로 원래 찍혀있는 색상을 쉐이딩한다고 생각하시면 쉽죠.
멀티텍스쳐가 지원되지 않을때 라이트매핑따위.

음.........
따지고 보니 알파블렌딩과 알파값은 사실 별 상관이 없어보이죠?
맞습니다.
그냥 텍셀마다 하나의 '확장 매개변수값'을 가지고 있다고 생각하세요.
이걸 가지고 무얼하는지는 순전히 프로그래머 맘이죠.


반응형

'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글

환경 맵(큐브 맵, Cube Map)  (0) 2012.11.08
Direct 에서 스피어함수  (0) 2012.11.02
점 그리기 -크기 변환  (0) 2012.11.02
점그리기  (0) 2012.11.02
Directx D3DXCreateSphere 구현  (0) 2012.11.02

+ Recent posts