[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();
}
'Technical Artist > ShaderMonkey' 카테고리의 다른 글
[ShaderMonkey] 기초적인 조명 셰이더 (0) | 2021.11.24 |
---|---|
[ShaderMonkey] Texture Mapping (0) | 2021.11.23 |
[shader monkey] 첫 셰이더 만들기 (0) | 2021.11.09 |
블로그의 정보
농담곰담곰이의곰담농
브이담곰