使用Vulkan + OpenXR,在任务中获得奇怪的透明度结果PCVR中不存在

问题描述

长话短说,alpha值表现得很奇怪:在1.0到0.5之间合理地转换,但从0.5到0.0从半透明性({color})转换为不透明黑色。

enter image description here

^这是我的字体渲染器(从探照任务捕获到iPhone),并替换了着色器。根据片段x坐标的正弦,它应该而不是显示字体,而是显示红色四边形,其淡入和淡出透明度。我不知道“黑色”是从哪里来的。这是着色器:

#version 450
#extension GL_KHR_vulkan_glsl : enable
#extension GL_ARB_separate_shader_objects : enable
#extension GL_EXT_multiview : enable
layout(set = 0,binding = 2) uniform sampler2D colorSampler;
layout(location = 0) in vec2 fragUV;
layout(location = 0) out vec4 outColor;
void main()
{
  float x = (sin(gl_FragCoord.x/20.0)+1.0)/2.0;
  outColor = vec4(1.0,0.0,x)
}

我的管道混合配置为:

VkPipelineColorBlendAttachmentState colorBlendAttachment = {};
  //alpha blend
  colorBlendAttachment.colorWriteMask =
    VK_COLOR_COMPONENT_R_BIT |
    VK_COLOR_COMPONENT_G_BIT |
    VK_COLOR_COMPONENT_B_BIT |
    VK_COLOR_COMPONENT_A_BIT |
    0;
  colorBlendAttachment.blendEnable = VK_TRUE;
  colorBlendAttachment.srcColorBlendFactor = VK_BLEND_FACTOR_SRC_ALPHA;
  colorBlendAttachment.dstColorBlendFactor = VK_BLEND_FACTOR_ONE_MINUS_SRC_ALPHA;
  colorBlendAttachment.colorBlendOp = VK_BLEND_OP_ADD;
  colorBlendAttachment.srcAlphaBlendFactor = VK_BLEND_FACTOR_ONE;
  colorBlendAttachment.dstAlphaBlendFactor = VK_BLEND_FACTOR_ZERO;
  colorBlendAttachment.alphaBlendOp = VK_BLEND_OP_ADD;

VkPipelineColorBlendStateCreateInfo colorBlendInfo = {};

  colorBlendInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
  colorBlendInfo.logicOpEnable = VK_FALSE;
  colorBlendInfo.logicOp = VK_LOGIC_OP_COPY;
  colorBlendInfo.attachmentCount = 1;
  colorBlendInfo.pAttachments = &colorBlendAttachment;
  colorBlendInfo.blendConstants[0] = 0.0f;
  colorBlendInfo.blendConstants[1] = 0.0f;
  colorBlendInfo.blendConstants[2] = 0.0f;
  colorBlendInfo.blendConstants[3] = 0.0f;

最古怪的一点是,从pcvr运行时,它可以完美地运行(按预期)(两者之间的代码路径没有主要区别:相同的spirv,相同的管道生成等)

解决方法

您已在colorWriteMask中启用了alpha写入功能,并且(1 *源+ 0 *目标)混合alpha方程,因此您将用文本不透明性覆盖帧缓冲区的alpha。在交换链的CompositeAlpha为VK_COMPOSITE_ALPHA_PRE / POST_MULTIPLIED_BIT_KHR的情况下,合成器将交换链图像与表面后面的图像混合在一起,并且由于您将低于1的alpha写入文本应该位于的图像中,因此合成器认为这些区域是半透明的。在绘制交换链图像时,应通过从混合参数中的colorWriteMask中删除Alpha位,或通过(0 *源+ 1 *目标)Alpha混合方程来禁用写Alpha通道,或者如果VkSurfaceCapabilitiesKHR为VHR,则使用VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR交换链CompositeAlpha目标表面声明其可用性(建议使用此方法以更快地合成)。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...