Vertex = 정점
무언가를 그리기 위한 정점
NDC 좌표계 (정규 좌표계)
정규화된 좌표계로 -1 ~ +1으로 나타낸다
2D 공간
렌더링 파이프라인
IA -> VS -> RS -> PS
IA (Input Assembly)
VertexBuffer, Primitive Topology
CPU의 정보를 GPU로 받아온다
정점 정보, 정점을 어떻게 그릴건지
(정점의 Position)
VS (Vertex Shader)
정점을 셰이더에서 어떻게 변화시킬건지
WVP가 NDC좌표계로 변경된다
RS (Rasterization)
정점을 3D공간에서 2D공간으로 바꿔준다
정점을 픽셀로
Viewport를 설정한다
(정점에서 정점까지 선을 긋는다고 생각하면 그 선을 이루는 픽셀들을 만드는 작업)
PS (Pixel Shader)
한 점 한 점을 어떻게 세팅할건지 (색 결정)
(픽셀 하나하나를 어떻게 세팅할건지)
struct VertexInput
{
float4 Position: Position;
};
struct VertexOutput
{
float4 Position: SV_Position;
};
VertexOutput VS(VertexInput input)
{
VertexOutput output;
output.Position = input.Position;
return output;
}
float4 PS(VertexOutput input) : SV_Target
{
return float4(1, 0, 0, 1); //Red
}
float4 PS2(VertexOutput input) : SV_Target
{
return float4(0, 1, 0, 1); //Green
}
float4 PS3(VertexOutput input) : SV_Target
{
return float4(0, 1, 1, 1); //Blue
}
VS에서 input을 output에 넣어주고, PS에서는 픽셀의 색을 정해준다
technique11 T0
{
pass P0
{ //PS를 사용한 pass -> Red
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS()));
}
pass P1
{ //PS2를 사용한 pass -> Green
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS2()));
}
}
technique11 T1
{
pass P0
{ //PS3을 사용한 pass -> Blue
SetVertexShader(CompileShader(vs_5_0, VS()));
SetPixelShader(CompileShader(ps_5_0, PS3()));
}
}
technique와 pass는 여러개를 만들어 사용할 수 있다
분리해서 만들고 싶을 때 쓰면 된다
shader->Draw(1, 0, 4, 2);
매개변수 순서대로 1번 Technique, 0번 pass, 4개의 정점을 그리기, 2번 정점부터 그리기
-> T1의 P0으로 vertices[2]부터 4개의 정점을 그린다 (Topology는 LineList, 코드생략)
D3D11_BUFFER_DESC desc;
ZeroMemory(&desc, sizeof(D3D11_BUFFER_DESC));
desc.ByteWidth = sizeof(Vertex) * 6; //Vertex 6개 메모리 잡아주기
desc.BindFlags = D3D11_BIND_VERTEX_BUFFER; //정점 그리기용 버퍼
//RAM -> VRAM 으로 복사
D3D11_SUBRESOURCE_DATA subResource = { 0 };
subResource.pSysMem = vertices; //vertices의 주소
Check(D3D::GetDevice()->CreateBuffer(&desc, &subResource, &vertexBuffer));
Buffer를 생성한다
Buffer를 초기화한 뒤에 Vertex size와 버퍼의 종류를 넣어준다
vertices의 주소도 넣어준다
D3D::GetDC()->IASetVertexBuffers(0, 1, &vertexBuffer, &stride, &offset);
D3D::GetDC()->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
//두개씩 묶어서 그리기
Render()영역에서 Buffer를 설정해준다
여기서 IA : 렌더링 파이프라인에 있던 IA로, Buffer에 넣어둔 vertices정보와 Primitive Topology를 세팅한다
Topology
LineList는 정점을 두개씩 묶어서 그린다
LineStrip은 정점들을 계속 연결해서 그린다
'> Study > DirectX' 카테고리의 다른 글
[DirectX] Texture (0) | 2024.01.23 |
---|---|
[DirectX] Grid, Camera (0) | 2024.01.04 |
[DirectX] World Matrix (2) | 2023.12.21 |
[DirectX] Triangle, Rectangle (0) | 2023.12.21 |
[DirectX] (1) | 2023.12.20 |