| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 | 31 |
Tags
- CTF
- 언리얼엔진
- photon fusion2
- gameplay tag
- C++
- Aegis
- local prediction
- gas
- 게임개발
- ability task
- Replication
- 보안
- UI
- attribute
- 언리얼 엔진
- 게임 개발
- listen server
- 유니티
- Unreal Engine
- widget
- unity
- Multiplay
- animation
- rpc
- gameplay ability system
- linear regression
- gameplay effect
- os
- stride
- MAC
Archives
- Today
- Total
Replicated
텍스처, UV 본문
인덱스 버퍼
정점들 미리 정의해두고 인덱스로 넘기면 효율적이니까 사용
버텍스는 무겁다
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 |