그래서 VertexDat.h에 uv를 사용하는 구조체 중 position과 uv만을 사용하는 VertexTextureData를 이용할 것이다
이전에 만든 CreateQuad()안에 있는 내용을 복사해 붙여넣어준 뒤 VertexTextureData로 바꿔준다
이때 Color가 아닌 UV로 맵핑을 하기 위해선 UV 좌표계에 대해 생각해 봐야한다
사진처럼 UV좌표계는 0,0부터 오른쪽 아래로 갈수록 1로 커지며, 0~1사이의 값을 갖는다
이를 우리가 만든 도형의 좌표와 일치시켜야 그 도형에 맞게 Texture가 들어갈 것이다
즉 VertexData 배열에 position과 UV과표계를 일치시켜 UV를 넣어주면 되는 것이다
예를 들어 VertexData[0].position은 첫번째 그려질 좌표로(-0.5, -0.5) 좌표를 가지며, 왼쪽, 아래에 위치하고 있는데, 이를 UV 좌표로 보면 (0,1)지점 이므로 VertexData[0].uv에 Vec2(0.0f,1.0f)좌표를 저장하는 식으로 매핑을 해준다
Shader
Shader는 이전과 동일하지만 Texture와, uv를 사용하므로 이들과 SamplerState가 추가 될 것이다
Texture2D로 Texture0 변수를 만들어 CPU에서 이 이름으로 GPU로 넘겨줄 수 있게 이름을 지정해준다
VertexInput/Output 함수에선 Color가 아닌 UV를 사용할 것이므로 float2 uv : TEXCOORD로 변경해준다
VS()에서도 color를 넘겨주는 것을 uv로 바꿔주면 된다
이때 PS()로 넘어가기 전 SamplerState를 만들어 이를 적용할 수 있도록 해준다
SamplerState : Texture를 UV 매핑시 이 과정을 통해 텍스터 데이터를 샘플링하고 필터링하는 방식을 정의하는데, 이는 매핑 과정에서 UV좌표가 Texture Data에 정확히 일치하지 않거나 Texture의 해상도와 화면의 픽셀 해상도가 달라질 때 이를 처리하는 방법을 지정하는 것이다
이를 만들어 줬다면 PS()에서 Texture Data를 저장했던 Texture0을 이용해 Sample()을 호출해 SamplerState와 uv를 넘겨 매핑을 하게 해준다
TextureDemo Class
우리는 저번 프로젝트에서 Texture를 Load시켜 사용하기 위해 Texture Class를 만들어 Texture를 Load하고, 이를 Poxel Shader에서 사용하기 위해 SRV(ShaderResourceView)를 만들어줬다
하지만 이 방법은 동일한 Texture를 사용하게 된다면 여러번 Texture 파일을 Load하기 때문에 ResourceManager를 만들어 Resource 파일이 있는지 없는지 판단해 없다면 map에 key와 value로 저장하고, 존재한다면 key값을 통해 가져오는 식으로 만들어놨었다
이전 프로젝트에서 이런저런 과정을 통해 쉽게 Texure를 매핑할 수 있도록 만들었기 때문에 현재 프로젝트에선 쉽게 사용이 가능하다
04.CameraDemo 파일을 복사해 이름을 TextureDemo로 바꿔준 뒤 Texture를 사용하기 위해 Texture 객체를 만들어준다
Init()에서는 m_pTexture에 미리 컴파일된 헤더에서 메크로로 만든 RsourceManage를 불러오는 RESOURCE를 이용해 Load함수를 호출해준다
이때 이 함수는 Template로 이루어져 있으므로 Texture라는 것을 알려주고, Resource 파일들을 저장해 놓은 파일 위치와 key 값을 Load()에 넘겨주어 그 위치에 key값으로 된 파일이 저장되어 있는지 판단해 저장되어있다면 그 값을 return하고, 그렇지 않다면 저장 후 return해준다
Render()에서도 shader->GetSRV()를 콜하여 Shader 파일에서 만든 이름으로 SRV를 가져와 그 안에 SetResource()를 통해 m_pTexture의 주소를 넘겨 사용하고자하는 Texture를 Sahder에서 사용할 수 이도록 해준다