//점의 색상에 알파값을 적용하기 위한state
_pD3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, TRUE );
_pD3dDevice->SetRenderState( D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
_pD3dDevice->SetRenderState( D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
_pD3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE,TRUE);//점이 스프라이트로 그려지기 때문에 텍스쳐 가능을 켜야 한다
_pD3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE,TRUE);//크기 크게 가능
//이 세 개의 상수는 거리에 따라 포인트 스프라이트의 크기가 변하는 방법을 제어한다. 야기에서 말하는 거리란 카메라와 포인트 스프라이트 간의 거리이다.
//이것을 쓰려면 A=x,B=y,C=z 세개다 몇시해 줘야 한다
_pD3dDevice->SetRenderState(D3DRS_POINTSCALE_A,0);
_pD3dDevice->SetRenderState(D3DRS_POINTSCALE_B,0);
_pD3dDevice->SetRenderState(D3DRS_POINTSCALE_C,1);
float PointSize = 10.0f;
_pD3dDevice->SetRenderState( D3DRS_POINTSIZE , *((DWORD*)&PointSize));
_pD3dDevice->SetRenderState(D3DRS_POINTSIZE_MAX,*((DWORD*)&PointSize)); //max 가 0 이 아니어야 한다
PointSize = 0.0f;
_pD3dDevice->SetRenderState(D3DRS_POINTSIZE_MIN, *((DWORD*)&PointSize));
_pD3dDevice->SetStreamSource( 0, NULL, 0, sizeof(VERTEX_POSCOLORPOINT) );
_pD3dDevice->SetFVF( D3DFVF_POS_DIFFUSE );
_pD3dDevice->SetIndices( NULL );
_pointNodes[0]._color=D3DCOLOR_ARGB(33,0xff,0xff,0xff);
_pD3dDevice->DrawPrimitiveUP( D3DPT_POINTLIST,_pointNodes.size(),(void*)&_pointNodes[0], sizeof(VERTEX_POSCOLORPOINT) );
PointSize = 1.0f;
_pD3dDevice->SetRenderState( D3DRS_POINTSIZE , *((DWORD*)&PointSize));
_pD3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE,FALSE);
_pD3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE,FALSE);
_pD3dDevice->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
_pD3dDevice->SetRenderState(D3DRS_POINTSCALE_C,0);
float 를 DWORD 로 변환할때 &,* 를 사용하는 이유
*(DWORD*)&PointSize 로 해야 제대로 소수부분또한 실수로 변환되어 DWORD 에서 실수에서의 값을 갖고 있게 된다
즉 *(DWORD*)&PointSize 에서 넘겨지는 DWORD 는 float 형을 DWORD의 비트열로 변환한 값을 필요로 한다는 것.
'그래픽스(Graphics) > DirectX9~12' 카테고리의 다른 글
Direct 에서 스피어함수 (0) | 2012.11.02 |
---|---|
투명처리와 알파 합성 (0) | 2012.11.02 |
점그리기 (0) | 2012.11.02 |
Directx D3DXCreateSphere 구현 (0) | 2012.11.02 |
디바이스를 잃었을때의 복구 절차 (0) | 2012.11.02 |