Vulkan[14] 정점 버퍼

3926 단어 Vulkan그래프

교점 버퍼 생성


이 섹션의 코드는 13-init_vertex_buffer.cpp입니다.
정점 캐시는 CPU가 볼 수 있는 버퍼와 GPU가 볼 수 있는 버퍼입니다. 이것은 당신이 보여 주고 싶은 대상 (s) 의 기하학적 도형을 설명하는 정점 데이터를 포함합니다.일반적으로 정점 데이터는 위치(x, y,z) 데이터와 선택할 수 있는 색깔, 법선 또는 다른 정보로 구성된다.다른 3D api와 마찬가지로 이 정점 데이터로 버퍼를 채우고 그리는 동안 GPU에 전달하는 방법이 있습니다.

교점 버퍼 객체 작성


정점 버퍼를 만드는 것은 Uniform 버퍼를 만드는 것과 거의 같습니다. 먼저 버퍼 대상을 만듭니다. 예를 들어 Uniform 예에서 그랬던 것처럼.
VkBufferCreateInfo buf_info = {};
buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
buf_info.pNext = NULL;
buf_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
buf_info.size = sizeof(g_vb_solid_face_colors_Data);
buf_info.queueFamilyIndexCount = 0;
buf_info.pQueueFamilyIndices = NULL;
buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
buf_info.flags = 0;
res = vkCreateBuffer(info.device, &buf_info, NULL, &info.vertex_buffer.buf);

Uniform 버퍼 객체 작성과 정점 버퍼 객체 간의 유일한 실제 차이점은 필드 설정usage입니다.
입방체 데이터(g_vb_solid_face_colors_Data는 36개의 정점으로 구성되어 있는데 이 정점들은 12개의 삼각형을 정의하고 6개의 입방체의 면마다 2개가 있다.각 삼각형에도 이와 연관된 면의 색상이 있습니다.너는 cube_data.h 파일을 검사해서 실제 데이터를 볼 수 있다.

정점 버퍼 메모리 할당


마찬가지로 이러한 단계는 Uniform 버퍼를 지정하는 단계와 매우 비슷합니다.우선 메모리 수요를 얻기 위해 검색을 진행하는데, 이는 정렬과 같은 기계적 제한을 고려하는 것을 포함한다.샘플의 코드를 보십시오.

버퍼에 정점 데이터 저장


할당되면 메모리가 매핑되고 정점 데이터로 초기화된 다음 매핑을 취소합니다.
uint8_t *pData;
res = vkMapMemory(info.device, info.vertex_buffer.mem, 0,
                  mem_reqs.size, 0, (void **)&pData);

memcpy(pData, g_vb_solid_face_colors_Data,
       sizeof(g_vb_solid_face_colors_Data));

vkUnmapMemory(info.device, info.vertex_buffer.mem);

마지막으로 메모리가 버퍼 객체에 바인딩됩니다.
res = vkBindBufferMemory(info.device, info.vertex_buffer.buf,
                         info.vertex_buffer.mem, 0);

입력한 정점 데이터 설명


정점 데이터의 구조는 다음과 같습니다.
struct Vertex {
    float posX, posY, posZ, posW; // Position data
    float r, g, b, a;             // Color
};

GPU에 이 데이터의 배열을 알리기 위해 정점 입력 연결을 만들어야 합니다.다음 vi_bindingvi_attribs의 멤버는 여기서 설정되지만 이후의 도면 파이프라인 생성 예제에서 사용됩니다.그러나 정점 데이터 형식을 보고 있으므로 다음 코드를 확인하는 것이 좋습니다.
info.vi_binding.binding = 0;
info.vi_binding.inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
info.vi_binding.stride = sizeof(g_vb_solid_face_colors_Data[0]);

info.vi_attribs[0].binding = 0;
info.vi_attribs[0].location = 0;
info.vi_attribs[0].format = VK_FORMAT_R32G32B32A32_SFLOAT;
info.vi_attribs[0].offset = 0;
info.vi_attribs[1].binding = 0;
info.vi_attribs[1].location = 1;
info.vi_attribs[1].format = VK_FORMAT_R32G32B32A32_SFLOAT;
info.vi_attribs[1].offset = 16;
stride는 정점의 크기나 다음 정점을 가리키는 바늘에 필요한 수량이다.bindingbinding 구성원들은 GLSL 착색기 소스 코드에서 각자의 값을 인용한다.색인 견본에서 색인 소스 코드를 볼 수 있습니다.
첫 번째 속성은 위치 데이터입니다. 4 바이트의 부동 소수점 형식은attribute 0 format 구성원을 설명하는 데 사용됩니다.attribute 1 format 은 분명히 색 형식이기 때문에 attribute 1 은 색을 가리킨다.offset 구성원은 정점 데이터에서 각 속성을 찾는 지시기입니다.

렌더링 프로세스에 정점 버퍼 바인딩


다음 예시에서 볼 수 있기 때문에 렌더링 프로세스를 설정하는 대부분의 코드를 건너뛸 수 있습니다.그러나 이제 렌더링 프로세스에 교점 버퍼를 바인딩하는 코드를 찾습니다.
vkCmdBeginRenderPass(info.cmd, &rp_begin, VK_SUBPASS_CONTENTS_INLINE);

vkCmdBindVertexBuffers(info.cmd, 0,             /* Start Binding */
                       1,                       /* Binding Count */
                       &info.vertex_buffer.buf, /* pBuffers */
                       offsets);                /* pOffsets */

vkCmdEndRenderPass(info.cmd);

렌더링 프로세스 내부에서만 정점 버퍼와 렌더링 프로세스를 연결할 수 있음을 주의하십시오.다시 말하면 vkCmdBeginRenderPassvkCmdEndRenderPass 사이에 있다.이것은 실제로 GPU가 그릴 때 어떤 정점 버퍼를 사용해야 하는지를 알려준다.
© Copyright 2016 LunarG, Inc

좋은 웹페이지 즐겨찾기