Draw Nomals

Date:     Updated:

카테고리:

태그:

홍정모님의 그래픽스 새싹코스 강의를 듣고 정리한 내용입니다.


🐥 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

result



맨 위로 이동하기

Graphics 카테고리 내 다른 글 보러가기

댓글 남기기