RenderPass의 효율적인 후면 효과
11279 단어 Vulkan
미리 준비하다
RenderPass에 대한 자세한 내용은 전날 보도를 참조하십시오.
규격 제정
이번에 실시된 색조 매핑은 다음과 같은 경로로 실시될 것이다.
그림의 Rr 및 Out은 리소스(Image)로서 다음 매개변수로 생성됩니다.
VK_FORMAT_R16G16B16A16_SFLOAT
VK_FORMAT_R8G8B8A8_UNORM
RenderPass 작성
그럼 우선 Attachment부터 정의합니다.
const attachmentRr = VkAttachmentDescription { 0, VK_FORMAT_R16G16B16A16_SFLOAT, VK_SAMPLE_COUNT_1_BIT,
VK_ATTACHMENT_LOAD_OP_CLEAR, VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
const attachmentOut = VkAttachmentDescription { 0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT,
VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_STORE,
VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
일반적인 렌더링을 받는 쪽은 내용을 지워야 하지만 최종적으로 데이터가 필요한 것은 아니기 때문에 지정했습니다.반대로 출력단은 모든 픽셀을 출력하기 때문에 앞의 픽셀은 상관없고 뒤의 RenderPass도 사용할 수 있으니 메모리에 다시 쓰십시오.또한finalLayout을 지정하여 명암 입력(무늬)으로 사용할 수 있습니다.그런 다음 Subpass를 정의합니다.
const passNormalRenderOutput = VkAttachmentReference { 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL });
const passTonemapSource = VkAttachmentReference { 0, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL };
const passTonemapOutput = VkAttachmentReference { 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL };
const passNormalRender = VkSubpassDescription { 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
0, nullptr, 1, &passNormalRenderOutput, nullptr, nullptr, 0, nullptr };
const passTonemap = VkSubpassDescriptor { 0, VK_PIPELINE_BIND_POINT_GRAPHICS,
1, &passTonemapSource, 1, &passTonemapOutput, nullptr, nullptr, 0, nullptr};
처음 세 행에는 Attachment에 대한 참조가 정의되어 있습니다.COLOR로 내보내기 -ATTACHMENT_OPTIIMAL, 카드는 SHADERREAD_ONLY_OPTIIMAL이어야 하기 때문에 그 설정을 진행하고 있습니다.나머지 네 줄에서 경로를 정의합니다.마지막으로 의존성의 정의다.이번에는 경로 1을 실행하기 전에 경로 0을 완성해야 하기 때문에 여기에 기술합니다.
const depNormalToTone = VkSubpassDependency { 0, 1, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
VK_ACCESS_SHADER_READ_BIT, VK_DEPENDENCY_BY_REGION_BIT };
모든 픽셀에 대해 DEPENDENCY 필요 없음 -BY_REGION_BIT를 지정합니다.마지막으로 RenderPass를 작성합니다.
const attachments = std::make_unique<VkAttachmentDescription[2]>({ attachmentRr, attachmentOut });
const passes = std::make_unique<VkSubpassDescription[2]>({ passNormalRender, passTonemap });
const rpinfo = VkRenderPassCreateInfo { VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0,
2, attachments.get(), 2, passes.get(), 1, &depNormalToTone };
auto res = vkCreateRenderPass(device, &rpinfo, nullptr, &renderPass);
범례 섀도우 생성하기
이번에는 집게만 하는 면도기를 만들었다.정점 성형기는 정점을 간단하게 출력해서 입력하는 방식만 사용하고 다음은 세션 모드의 코드입니다.
layout(location = 0) out vec4 color;
layout(set = 0, binding = 0, input_attachment_index = 0) uniform subpassInput intex;
void main() { color = clamp(subpassLoad(intex), vec4(0.0f), vec4(1.0f)); }
두 번째 행의 정의는 첨부 파일을 가져올 때의 정의입니다.첨부 파일을 유니폼 값으로 입력하면 Piperline Layout도 정의해야 한다.입력 첨부는 무늬가 아니기 때문에 자신의 유형subpassInput
으로 표시한다.subpassInput
를 사용하여 픽셀 데이터를 읽습니다.subpassLoad
만 납부subpassLoad
할 수 있는데 이것은 울타리화 픽셀에 대응하는 픽셀 데이터만 얻을 수 있기 때문이다.따라서 subpassInput
를 사용하여 구리관과 같은 처리를 실시할 수 없다.입력 첨부 파일 수신 준비
앞에서 처리한 바와 같이 첨부 파일을 제복 값으로 입력하면 수신되기 때문에 Piperline Layout에 등록해야 한다. 즉, 해당하는Descriptor SetLayout을 만들어야 한다.
입력 첨부 파일 대응
subpassInput
은 VkDescriptorType
이므로 지정합니다.const descbindToneInput = VkDescriptorSetBinding { 0,
VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1,
VK_SHADER_STAGE_FRAGMENT_BIT, nullptr };
이제 Framebuffer를 일반적으로 준비하여 파이프라인을 구성하여 그립니다.샘플의 모든 코드는 없지만 이렇게 할 수도 있어요.그 외에 특정 영역만 덮어쓰는 다각형 등 두 번째로 모든 다각형을 덮어쓰면 템플릿과 유사할 수 있다고 생각합니다.
Reference
이 문제에 관하여(RenderPass의 효율적인 후면 효과), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Pctg-x8/items/a1a39678e9ca95c59d19텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)