농담곰담곰이의곰담농

[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();

}

Dx로 변환 성공

블로그의 정보

농담곰담곰이의곰담농

브이담곰

활동하기