랜더링시 특정색을 알파값으로 사용하려면 어찌하나여

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
비회원

랜더링시 특정색을 알파값으로 사용하려면 어찌하나여

Post by 비회원 »

오브젝트별로 블러를 주기위해 텍스쳐를 만들고 특정한색( ex: 255,0,255 )로 clear한후 오브젝트를 랜더링하고나서 그 텍스쳐를 뿌리려고 합니다.
그래서 뿌릴때 특정색을 알파처럼 사용해서 없애고 싶은데여...
CreateTextureFromFileEx를 써서 처음에 특정색을 알파로 지정하는건 알고있는데
랜더링시에 지정할 수 있는 방법이 없을까여?
고수님들의 가르침 부탁드립니다!
제발~~
비회원

텍스쳐를 로드할때 알파값 수정하면됩니다.

Post by 비회원 »

텍스쳐 포인터를 얻어오면

텍스쳐의 구조는 단순히 점들의 나열이기 때문에

점 하나는 4바이트를 차지하죠. ARGB 로요.

텍스쳐를 읽고 나서 for문으로 돌아가면서 특정색의 알파값을 0으로 만들면 됩니다.

자주 쓰인다면 알파먹인 텍스쳐를 하나 더 만들어놓는게 좋겠죠.
비회원

랜더링시 계속 ...

Post by 비회원 »

랜더링시 계속해서 특정색의 알파값을 0 으로 해줘야만 하는건가여?
퍼포먼스에서 별로 좋지 안을듯 싶어서여...
그렇게 수동으로 픽셀에 접근하는 방법말고
DX에서 제공하는 어떤 특별한 함수 라던가 셋팅은 없을까여?
비회원

Post by 비회원 »

렌더타겟을 D3DFMT_A8R8G8B8 로 만들고 clear를 하는 특정한색에 알파도 같이 지정하시면 됩니다.

그리고 오브젝트를 출력하구요...그러면 오브젝트가 출력된 픽셀들은 알파값도 변경됩니다.
비회원

엮시나 알파가 안빠지는데...

Post by 비회원 »

m_pd3dDevice->CreateTexture( 512 ,
512,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&pTexture,
NULL);
이렇게 택스쳐를 만들고

m_pTexture->GetSurfaceLevel(0,&pTargetSurface);

이렇게 서피스를 얻어내고

m_pd3dDevice->SetRenderTarget(0,pTargetSurface);

이렇게 랜더타겟을 설정하고

m_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER,
D3DCOLOR_ARGB( 0,255,0,255), 1.0f, 0 );

이렇게 특정색( 255,0,255 ) 로 클리어할때 특정색의 알파를 '0'으로 셋팅해서 빠지게 했는데

이렇게 해서 이 랜더타겟 텍스쳐를 화면에 랜더링하면 분홍색 바탕에 오브젝트만 찍혀 있습니다.

그 분홍색 바탕을 알파로 빼버리고 싶은데 안되네여...

위분이 가르쳐주신 방법으로해도 안되고...

수동으로 매프레임마다 해주는 방법뿐인것인지....
비회원

추가적으로....

Post by 비회원 »

수동으로 텍스쳐의 255,0,255 색부분의 알파를 0 으로 바꿔주려고 했는데 안돼는군요 ㅡ,.ㅡ
RenderTarget용으로 생성된 텍스쳐는 LockRect 가 불가능 하네여...
픽셀로의 접근이 불가능하다는 결론이네여..
흑.. ㅡㅡ;
도와주세여~
비회원

Post by 비회원 »

제경우는 잘되던데.. 렌더타겟 출력시에도 알파로 찍어주신것 맞죠..?

혹 안된다면 렌더타겟을 복사해서 락을걸어서 픽셀값을 확인해보세요.
렌더타겟이 락은 안되지만 복사는 가능합니다.

Code: Select all

pDevice->SetFVF( D3DFVF_XYZRHW | D3DFVF_TEX1 );
pDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
pDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
pDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
pDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
pDevice->SetRenderState( D3DRS_ALPHAREF, 0x0 );

pDevice->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
pDevice->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
pDevice->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
pDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );

pDevice->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE );
pDevice->SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE );

pDevice->SetTexture( 0, pRenderTarget );

pDevice->DrawCall....();
Locked