cancel
Showing results for 
Search instead for 
Did you mean: 

Using Vulkan + OpenXR, getting strange transparency results on quest (not present in PCVR)

Phildo3
Protege
The long story short is that alpha values are behaving very strangely: transitioning reasonably between 1.0 to 0.5, but from 0.5 to 0.0 transitioning from half-opacity-{color} to opaque-black.

5pw7j2bvtogy.png
^ this is my font renderer (captured from quest beamed to iphone) with the shader replaced with:

#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)
}

My pipeline blend config is:
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;
The wackiest bit is that this works perfectly (as expected) when run from pcvr (with no major differences in code paths between the two: same spirv, same pipeline generation, etc...).
1 REPLY 1

Phildo3
Protege
Some additional clarification: the image is _supposed_ to be showing the quads that would normally be used to render some text (working) fading from opaque red (working) to transparent (broken) according to the sin of the fragment x coordinate (working). The problem is that rather than a fade-to-transparent-red, they fade-to-opaque-black-with-some-transparency-in-between. I have no idea where the black is coming from.

Additionally, the shader/pipeline parameters work perfectly on PCVR, so it isn't a simple math/code flow bug.