Replicated

텍스처, UV 본문

DirectX 11

텍스처, UV

라구넹 2026. 8. 1. 18:08

인덱스 버퍼

정점들 미리 정의해두고 인덱스로 넘기면 효율적이니까 사용

버텍스는 무겁다

 

void Game::CreateGeometry()
{
	{
		_vertices.resize(4);

		/*
		* 13
		* 02
		*/

		_vertices[0].position = Vec3(-0.5f, -0.5f, 0.0f);
		_vertices[0].color = Color(1.0f, 0.0f, 0.0f, 1.0f);

		_vertices[1].position = Vec3(-0.5f, 0.5f, 0.0f);
		_vertices[1].color = Color(0.0f, 1.0f, 0.0f, 1.0f);

		_vertices[2].position = Vec3(0.5f, -0.5f, 0.0f);
		_vertices[2].color = Color(0.0f, 0.0f, 1.0f, 1.0f);

		_vertices[3].position = Vec3(0.5f, 0.5f, 0.0f);
		_vertices[3].color = Color(0.0f, 0.0f, 1.0f, 1.0f);
	}

	// Vertex Buffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(desc));
		desc.Usage = D3D11_USAGE_IMMUTABLE;	// GPU Read Only
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
		desc.ByteWidth = static_cast<uint32>( sizeof(Vertex) * _vertices.size() );

		D3D11_SUBRESOURCE_DATA data;
		ZeroMemory(&data, sizeof(data));
		data.pSysMem = &_vertices[0];

		_device->CreateBuffer(&desc, &data, _vertexBuffer.GetAddressOf());
	}

	// Index
	{
		_indices = { 0, 1, 2, 2, 1, 3 };

	}

	// Index Buffer
	{
		D3D11_BUFFER_DESC desc;
		ZeroMemory(&desc, sizeof(desc));
		desc.Usage = D3D11_USAGE_IMMUTABLE;	// GPU Read Only
		desc.BindFlags = D3D11_BIND_INDEX_BUFFER;
		desc.ByteWidth = static_cast<uint32>(sizeof(uint32) * _indices.size());

		D3D11_SUBRESOURCE_DATA data;
		ZeroMemory(&data, sizeof(data));
		data.pSysMem = &_indices[0];

		HRESULT hr = _device->CreateBuffer(&desc, &data, _indexBuffer.GetAddressOf());
		CHECK(hr);
	}
}

인덱스 버퍼 만들고

 

void Game::Render()
{
	RenderBegin();

	{
		uint32 stride = sizeof(Vertex);
		uint32 offset = 0;

		// IA
		_deviceContext->IASetVertexBuffers(0, 1, _vertexBuffer.GetAddressOf(), &stride, &offset);
		_deviceContext->IASetIndexBuffer(_indexBuffer.Get(), DXGI_FORMAT_R32_UINT, 0);
		_deviceContext->IASetInputLayout(_inputLayout.Get());
		_deviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

		// VS
		_deviceContext->VSSetShader(_vertexShader.Get(), nullptr, 0);

		// RS

		// PS
		_deviceContext->PSSetShader(_pixelShader.Get(), nullptr, 0);

		// OM
		//_deviceContext->Draw(_vertices.size(), 0);
		_deviceContext->DrawIndexed(_indices.size(), 0, 0);
	}

	RenderEnd();
}
IASetIndexBuffer

로 인덱스 버퍼 넣어주고 

DrawIndexed

로 그려주면

이렇게 됨

결국 인덱스 버퍼는 정점 개수 메모리에 올라가는 거 줄일 수 있으니 이득

 

뭐 아무튼 이런 거에 실제 이미지를 넣을 수 있어야 함

이미지 파일에서 좌표를 꺼내야 함

-> uv 필요

uv는 0~1 사이의 값으로 이미지 매핑하는 것

 

_vertices[0].position = Vec3(-0.5f, -0.5f, 0.0f);
_vertices[0].uv = Vec2(0.0f, 1.0f);
//_vertices[0].color = Color(1.0f, 0.0f, 0.0f, 1.0f);
		
_vertices[1].position = Vec3(-0.5f, 0.5f, 0.0f);
_vertices[1].uv = Vec2(0.0f, 0.0f);
//_vertices[1].color = Color(0.0f, 1.0f, 0.0f, 1.0f);

_vertices[2].position = Vec3(0.5f, -0.5f, 0.0f);
_vertices[2].uv = Vec2(1.0f, 1.0f);
//_vertices[2].color = Color(0.0f, 0.0f, 1.0f, 1.0f);

_vertices[3].position = Vec3(0.5f, 0.5f, 0.0f);
_vertices[3].uv = Vec2(1.0f, 0.0f);
//_vertices[3].color = Color(0.0f, 0.0f, 1.0f, 1.0f);

UV 순서대로 맞춰서 넣고

 

VS_OUTPUT VS(VS_INPUT input)
{
    VS_OUTPUT output;
    output.position = input.position;
    //output.color = input.color;
    output.uv = input.uv;
    
    return output;
}

Texture2D texture0 : register(t0); 
SamplerState sampler0 : register(s0);

float4 PS(VS_OUTPUT input) : SV_Target
{
    float4 color = texture0.Sample(sampler0, input.uv);
    return color;
}

쉐이더도 수정해주고

void Game::CreateSRV()
{
	DirectX::TexMetadata md;
	DirectX::ScratchImage img;

	HRESULT hr = ::LoadFromWICFile(L"bubble.png", WIC_FLAGS_NONE, &md, img);
	CHECK(hr);

	hr = ::CreateShaderResourceView(_device.Get(), img.GetImages(), img.GetImageCount(), md, _shaderResourceView.GetAddressOf());
	CHECK(hr);


}

SRV도 만들어주고

 

_deviceContext->PSSetShaderResources(0, 1, _shaderResourceView.GetAddressOf());

SRV 세팅해주면

잘 된다

샘플러 스테이트 같은 걸 설정하면 uv 초과하거나 등등의 상황에 대해 옵션 지정 가능

'DirectX 11' 카테고리의 다른 글

RasterizerState, SampleState, BlendState  (0) 2026.08.01
Constant Buffer  (0) 2026.08.01
삼각형 띄우기  (0) 2026.08.01
장치 초기화  (0) 2026.08.01
Windows API로 진입점 만들기  (0) 2025.04.07