[Vulkan] Uniform Buffer보다 빠르고 간단한 PushConstant을 사용하고 싶어요.

5665 단어 C++Vulkantech

PushConstant


Vulkan에는 GPU로 데이터를 고속으로 밀어낼 수 있는 PushConstant이 있다.설치도 쉬워서 좋아요.하지만 사이즈가 작은 제한이 있습니다.
그럼에도 불구하고 모든 설비는 128bytes의 보증이 있기 때문에 그래도 사용할 수 있다.실제 조회 결과 RTX3090 최대 256 bytes 가 발견되었습니다.
auto props = physicalDevice.getProperties();
std::cout << "maxPushConstantsSize: " << props.limits.maxPushConstantsSize;
// maxPushConstantsSize: 256

설정


예를 들어 Compute shader를 사용합니다.

농담


마우스 위치 등을 입력합니다.매우 간단하고 필요없다binding.
sample.comp
layout(push_constant) uniform PushConstants {
    vec2 mousePosition;
    vec2 mouseMove;
} pushConstant;

C++ 측면에서 구조체 구성하기


struct PushConstants
{
    float mousePosition[2];
    float mouseMove[2];
};

PushConstants pushConstants;

Piperline Layout을 제작할 때 PushContantrange에 맡기기


vk::PushConstantRange pushRange;
pushRange.setOffset(0);
pushRange.setSize(sizeof(PushConstants));
pushRange.setStageFlags(vk::ShaderStageFlagBits::eCompute);

vk::PipelineLayoutCreateInfo createInfo;
createInfo.setSetLayouts(*descSetLayout);
createInfo.setPushConstantRanges(pushRange);
vk::PipelineLayout pipelineLayout = device.createPipelineLayout(createInfo);

명령 버퍼 요청


commandBuffer.pushConstants(
  *pipelineLayout, 
  vk::ShaderStageFlagBits::eCompute, 
  0, sizeof(PushConstants), &pushConstants);
끝.아주 간단합니다.

좋은 웹페이지 즐겨찾기