Draw Nomals
카테고리: Graphics
태그: DirectX
홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.
🐥 Draw Normal
추후 Geometry Shader를 이용하면 mesh의 vertex 정보만으로 normal을 그릴 수 있다고 한다. 이번 포스팅에서는 normal의 vertex들을 따로 구한 뒤, 메시와 별도로 렌더링하는 방식으로 구현한다.
Vertices / Indices
// Vertices 지정
for (size_t i = 0; i < meshData.vertices.size(); i++) {
auto v = meshData.vertices[i];
v.texcoord.x = 0.0f;
normalVertices.push_back(v);
v.texcoord.x = 1.0f;
normalVertices.push_back(v);
normalIndices.push_back(uint16_t(2 * i));
normalIndices.push_back(uint16_t(2 * i + 1));
// ...
m_context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_LINELIST);
}
- 기존 mesh의 vertex들을 두 번씩 삽입
- 하나는 texcoord.x = 0 : normal의 시작 지점
- 다른 하나는 texcoord.x = 1 : normal의 끝 지점
- Topology - D3D11_PRIMITIVE_TOPOLOGY_LINELIST로 지정하면 index 두개씩 짝지어 직선 그림
Constant Buffer
// Vertex Shader
cbuffer BasicVertexConstantBuffer : register(b0)
{
matrix model;
matrix invTranspose;
matrix view;
matrix projection;
};
cbuffer NormalVertexConstantBuffer : register(b1)
{
float scale; // normal의 길이
};
- MVP 변환은 기존 메시와 동일한 변환
- 메시 그릴 때 사용한 vertex buffer 그대로 사용!
- normal에 필요한 scale만 추가로 cpu -> gpu 보내주기
ID3D11Buffer *pptr[2] = {m_mesh->m_vertexConstantBuffer.Get(),
m_normalLines->m_vertexConstantBuffer.Get()};
m_context->VSSetConstantBuffers(0, 2, pptr);
- pointer를 이용하여 shader에 여러 개의 buffer 보내줄 수 있음
🐥 Results
댓글 남기기