물체를 사실적으로 표현하기 위해 표면에 입히는 이미지
단순하게 이미지 이외에 더 다양한 의미가 있었던걸로 기억하는데..?
이미지-픽셀 = texture-texel
1D texture, 2D texture, 3D texture, Cube texture
direct3d에서 texture3d는 array를 지원하지 않음
원본 텍스처를 2의 승수 크기로 낮춘 texture
메모리를 더 사용하지만 연산비용을 낮춤
texture array는 각 element별로 mipmap을 지원
이러한 mipmap같이 리소스의 일부를 지정할 수 있도록 하는 하위 리소스 집합
배열 슬라이스 : 텍스처의 모든 서브 리소스
밉맵 슬라이스 : 모든 텍스처의 동일 레벨 모든 밉맵
x = u, y = v, z = w
0 <= y, v, w <= 1
DirectX의 경우 화면좌표계를 이용(좌상단 원점)
Direct3d12 이전까지 사용하던 방식
D3D SDK가 2010.06년 이후로 지원하지 않음
D3D12의 Multithread Rendering을 위해 변경됨
대신 Git을 통해 기능 단위(DirectXTK, DirectXMath, DirectXTex)로 다운로드 가능
솔루션 파일에서 vcxproj파일을 읽을 경우 프로젝트 단위로 읽어들일 수 있음
DXTK를 컴파일해 생성한 library 사용
외부 include 사용 가능
외부 library 사용 가능
#pragma comment(lib, "DirectXTK.lib")
#include "WICTextureLoader.h" // dds를 제외한 모든 파일포맷
#include "DDSTextureLoader.h" // dds 파일 포맷 읽기. DX에서 사용하는 압축 방식?
namespace DirectX
{
HRESULT __cdecl CreateWICTextureFromFile(
_In_ ID3D11Device* d3dDevice,
_In_opt_ ID3D11DeviceContext* d3dContext,
_In_z_ const wchar_t* szFileName,
_Outptr_opt_ ID3D11Resource** texture,
_Outptr_opt_ ID3D11ShaderResourceView** textureView,
_In_ size_t maxsize = 0) noexcept;
}
ID3D11Resource -> 실제 텍스처 메모리? 용도를 알 수 없음
ID3D11ShaderResrouceView -> DeviceContext::PSSetShaderResource()에서 Texture 설정 시 사용
디지털 이미지를 처리를 지원하는 Low-Level API
Texture2D g_txTexutureA : register(t0);
SamplerState g_SampleA : register(s0);
struct PS_input
{
float4 p : SV_POSITION;
float4 c : COLOR0; // COLOR0~COLOR1
float2 t : TEXCOORD0; // TEXCOORD0 ~ TEXCOORD7 (15)
};
// 해당 픽쉘(SV_Target레지스터에)의 컬러를 반환한다.
float4 PS( PS_input input) : SV_Target
{
float4 vColor = g_txTexutureA.Sample(g_SampleA , input.t);
return vColor* float4(1,0,0,1);
}
SamplerState : texture와 출력 화면 사이의 크기 차이가 있을 때, sampling 처리 방법에 대한 것
Manager class를 사용하여 Resource의 생성, 삭제를 관리
Flyweight pattern(중복 제거, 메모리 공유)
Manager에서 생성된 Resource는 Manager에서 삭제되야 한다 = const 변수를 통해 반환해야 한다
Texture를 교체하는 방식 - 다양한 파일들이 존재할 경우
UV값을 교체하는 방식 - 1개의 파일에 다양한 이미지가 존재하는 경우
Gif나 avi같은 파일을 화가 알고리즘으로 처리하는 방법은 없나?