C++ Algorithm & Study/Game Math & DirectX 11

[Direct11] 16. Direct3D Texture

GameChoi 2023. 6. 16. 19:49

1. Direct3D Texture

1.1 Texture

1.1.1 Texture & Resource

 - 자료 원소들의 행렬, 2차원 이미지 자료를 저장하는 것

   - Texture의 각 원소는 한 픽셀의 색상을 담지만 유일한 용도는 아님

     - 법선 매핑을 사용할 때 Texture의 각 원소가 색상이 아닌 3차원 벡터를 담음

       - Texture의 밉맵 수준들이 존재, GPU는 필터링, 다중표본화 등의 특별한 연산을 Texture에 적용

DXGI_FORMAT_R32G32B32_FLOAT; // 세 개의 부동소수점 성분
DXGI_FORMAT_R8G8B8A8_TYPELESS; // 메모리만 확보,자료의 구체적인 해석 방식은 파이프라인을 묶을 때 지정

 - 렌더링 파이프라인에는 Texture를 묶을 수 있는 단계들이 여럿 존재

   - Texture를 렌더 대상으로 묶는 것 & 셰이더 자원으로서 묶는 것

     - 위의 두 가지 용도의 Texture를 사용할 때 Texture를 묶을 두 파이프라인 단계를 지정한 결속 플래그 사용

D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE

 - Texture 자원이 파이프라인의 단계에서 직접 묶이는 것이 아님

   - Texture가 연관된 Resource View를 파이프라인에 묶음

     - Direct3D에서 Texture를 사용할 때 Texture의 초기화 시점에서 Texture Resoure View를 생성해야 함

   - Texture를 렌더 대상과 셰이더 자원으로 사용

     - Direct3D에 자원의 사용 방식을 알려주고 생성 시점에서 무형식을 지정한 자원 형식의 구체적인 형식을 결정

1.1.2 Texture Pos

 - Direct3D는 u 축이 이미지의 가로 방향, v 축(위에서 아래)이 이미지의 세로 방향인 Teuture 좌표계를 사용

   - Texture의 좌표는 [0, 1] 구간으로 정규화된 좌표성분들을 사용, Teuture Image의 크기에 독립적인 좌표계를 위함

     - Texture Mapping을 위해서 각각의 3차원 삼각형마다 그 삼각형에 입힐 Texture 이미지상의 삼각형을 지정

   - 3차원 삼각형의 임의의 점에 대한 Texture 좌표

     - 삼각형 정점들에 지정된 Texture 좌표들을 삼각형 면을 따라 보간해서 구함

       - 보간에 의해 삼각형의 모든 점마다 그에 대응되는 Texture 좌표가 결정

struct Texture { XMFLOAT3 Pos; XMFLOAT3 Normal; XMFL0AT2 Tex;};

1.1.3 Texture Create & Use

 - Texture 자료는 디스크에 저장된 이미지 파일을 읽어 Texture2D 객체에 적재

   - Texture 자원이 렌더링 파이프라인에 직접 묶는 것이 아닌 Shader Resource View를 생성 & 파이프라인 묶음

D3DXllCreateTextureFromFile; // 이미지 로드
CreateShaderResourceView; // Texture 객체 생성 & SRV 생성

   - 위를 통해 Texture를 생성하였다면 픽셀 셰이더 안에서 그 Texture 자원에 접근할 수 있도록 설정

Texture2D gDiffuseMap; // Pixel Shader
ID3DXllEffectShaderResourceVariable* DiffuseMap; // C++ 응용프로그램
fxDiffuseMap = mFX—>GetVariableByName("gDiffuseMap")->AsShaderResource();

     - 위의 코드로 부터 효과 파일의 Texture2D 객체에 대한 포인터를 얻음

       - 마지막으로 변수를 갱신해야 한다면 반드시 Apply 함수를 호출

fxDiffuseMap->SetResource(mCrateMapSRV); pass->Apply(0, md3dImmediateContext);