[ShaderMonkey] 빨강 셰이더
by 브이담곰📌 3D 공간 변환

- 물체공간: 물체를 원점으로 했을 때의 지역공간.
- 월드공간: 화면(모니터)의 원점을 기준으로 했을 때의 공간.(세계공간)
- 뷰공간: 카메라가 사용하는 공간(원점은 카메라 렌즈 중앙)
- 투영공간: 이동,회전,확대.축소 한 물체들을 2D이미지 위에 투영하는 것.(직각투시법 또는 원근투시법 등등을 적용가능)
* 위의 모든 행렬들은 각 정점마다 값이 변하지 않으므로 전역변수로 선언하기에 적합하다.
📌 전역변수와 정점데이터
: 셰이더에서 사용할 수 있는 입력 값으로는 전역변수와 정점데이터가 있다.
- 전역변수: 모든 정점이 동일한 값을 사용할 때
ex) 월드 행렬, 카메라의 위치 등
- 정점버퍼(정점 데이터): 정점마다 다른 값을 사용한다면, 정점데이터의 일부로 값을 받아들여야 한다.
ex) 정점의 위치, UV좌표 등
📌 정점셰이더의 입력데이터(Vertex Shader)
: 정점셰이더에서 입력받을 데이터
💡 정점셰이더는 정점의 위치를 공간변환 한다.
sturct Vs_INPUT { float4 mPosition: POSITION;//POSITION = semantic(시멘틱) //float4 = 데이터 형(x,y,z,w를 가지는 벡터, 부동소수점 형) };
📌 정점셰이더의 출력데이터(Vertex Shader)
정점셰이더는 반드시 위치변환 결과를 반환해야한다. 각 픽셀의 위치를 찾아내려면 정점셰이더가 위치변환 결과를 래스터라이저에 전달해 줘야만 하기 떄문.
struct VS_OUTPUT { float4 mPosition: POSITION; };
📌 정점셰이더
float4x4 gWorldMatrix : World; float4x4 gViewMatrix : View; float4x4 gProjectionMatrix : Projection; struct VS_INPUT { float4 mPosition : POSITION; }; struct VS_OUTPUT { float4 mPosition : POSITION; }; VS_OUTPUT vs_main( VS_INPUT Input ) { VS_OUTPUT Output; Output.mPosition = mul( Input.mPosition, gWorldMatrix ); Output.mPosition = mul( Output.mPosition, gViewMatrix ); Output.mPosition = mul( Output.mPosition, gProjectionMatrix ); return Output; }

📌 픽셀셰이더
float4 ps_main() : COLOR0 { return( float4( 1.0f, 0.0f, 0.0f, 1.0f ) ); }
📌 directX에 셰이더 불러오기
//투영행렬을 만들 때 필요한 상수 정의 #define PI 3.14159265f #define FOV (PI/4.0f) //시야각 #define ASPECT_RATIO (WIN_WIDTH/(float)WIN_HEIGHT) // 화면의 종황비 #define NEAR_PLANE 1 //근접 평면 #define FAR_PLANE 10000 //원거리 평면 //모델과 셰이더를 불러올 포인터 정의 // 모델 LPD3DXMESH gpSphere = NULL; // 쉐이더 LPD3DXEFFECT gpColorShader = NULL;
//에셋 로딩 bool LoadAssets() { // 쉐이더 로딩 gpColorShader = LoadShader("ColorShader.fx"); if (!gpColorShader) { return false; } // 모델 로딩 gpSphere = LoadModel("sphere.x"); if (!gpSphere) { return false; } return true; }
//void CleanUp()에서 shader과 model release //메모리 누수 방지 // 모델을 release 한다. if (gpSphere) { gpSphere->Release(); gpSphere = NULL; } if (gpColorShader) { gpColorShader->Release(); gpColorShader = NULL; } // 쉐이더를 release 한다. if (gpColorShader) { gpColorShader->Release(); gpColorShader = NULL; }
// 3D 물체등을 그린다. void RenderScene() { //뷰행렬을 만든다 /*랜더몽키에서는 변수시멘틱을 통해 값을 직접 대입해야했지만 여기서는 이 값들을 직접 만들어서 셰이더에 전달해주어야 한다.*/ D3DXMATRIX matView; D3DXVECTOR3 vEyePt(0.0f, 0.0f, -200.0f);//카메라의 위치 D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);//카메라가 바라보는 곳 D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);//카메라의 위쪽 D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec); /*카메라의 현재위치와 카메라가 바라보는 곳의 위치, 카메리의 위쪽을 가리키는 벡터만 있으면 D3DXMatrixLookAtLH 함수를 호출하여 뷰행렬을 만들 수 있다.*/ //투영행렬을 만든다 D3DXMATRIXA16 matProjection; D3DXMatrixPerspectiveFovLH(&matProjection, FOV, ASPECT_RATIO, NEAR_PLANE, FAR_PLANE); /*D3DXMatrixPerspectiveFovLH: 원근 투시법*/ //월드행렬을 만든다. /*월드행렬은 한 물체의 위치와 방위, 그리고 확장/축소변환을 모두 합친 것이다.*/ D3DXMATRIXA16 matWorld; D3DXMatrixIdentity(&matWorld); //셰이더 전역변수들을 설정 gpColorShader->SetMatrix("gWorldMatrix", &matWorld); gpColorShader->SetMatrix("gViewMatrix", & matView); gpColorShader->SetMatrix("gProjectionMatrix", &matProjection); //셰이더를 시작한다. /*GPU에게 앞으로 그릴 모든 물체에 이 셰이더를 적용하라고 명령*/ UINT numPasses = 0; gpColorShader->Begin(&numPasses, NULL); { for (UINT i = 0; i < numPasses; i++) { gpColorShader->BeginPass(i); { //구체를 그린다. gpSphere->DrawSubset(0); } gpColorShader->EndPass(); } } gpColorShader->End(); }

블로그의 정보
농담곰담곰이의곰담농
브이담곰활동하기
농담곰담곰이의곰담농브이담곰 님의 블로그입니다.