Vulkan[14] 정점 버퍼
교점 버퍼 생성
이 섹션의 코드는
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_binding
및 vi_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
는 정점의 크기나 다음 정점을 가리키는 바늘에 필요한 수량이다.binding
와 binding
구성원들은 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);
렌더링 프로세스 내부에서만 정점 버퍼와 렌더링 프로세스를 연결할 수 있음을 주의하십시오.다시 말하면
vkCmdBeginRenderPass
과vkCmdEndRenderPass
사이에 있다.이것은 실제로 GPU가 그릴 때 어떤 정점 버퍼를 사용해야 하는지를 알려준다.© Copyright 2016 LunarG, Inc
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Vulkan 설치 및 배포 (windows VisualStudio 2017)qiita 첫 투고로 익숙하지 않지만 잘 부탁드립니다. Visual studio에서 Vulkan을 개발하는 환경을 정리한다. [OS] windows10 [GPU] Gtx 1080 & intel graphics 520...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.