首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Vulkan + OpenXR,在任务中获得奇怪的透明结果(在PCVR中不存在)

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

Stack Overflow用户
提问于 2020-10-13 20:15:15
回答 1查看 205关注 0票数 1

长话短说,alpha值表现得非常奇怪:在1.0到0.5之间合理地转换,但从0.5到0.0从半不透明{色}过渡到不透明-黑色。

^这是我的字体渲染器(从向iphone发送的任务中捕捉到的)和替换的着色器。它不应该显示字体,而应该根据片段x坐标的sin来显示透明的红色四边形。我不知道“黑”是从哪里来的。这是着色器:

代码语言:javascript
复制
#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,0.0,x)
}

我的管道混合配置是:

代码语言:javascript
复制
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运行时(这与预期一样)(两者之间的代码路径没有重大差异:相同的螺旋,相同的管道生成,等等)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-17 08:32:13

您已经在您的colorWriteMask中启用了alpha写入,并且(1 * source +0*目标值)混合了alpha方程,因此您要用文本不透明度覆盖框架缓冲区的alpha。交换链的VK_COMPOSITE_ALPHA_PRE/POST_MULTIPLIED_BIT_KHR,是交换链的compositeAlpha,排序者将你的交换链图像与表面后面的图像混合--因为你在文本应该在1下面的图像上写入alpha,所以排序者认为这些区域是半透明的。在绘制到交换链映像时,应该禁用写入alpha通道,方法是从混合参数中的colorWriteMask中删除alpha位,或者通过(0 * source +1* declare ) alpha混合方程,或者使用VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR swapchain compositeAlpha,如果目标表面的VkSurfaceCapabilitiesKHR声明其可用性(这对于可能更快的组合也是推荐的)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64342549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档