当我遇到一个视觉错误时,我正在处理一些 Vulkan 光线跟踪渲染器。当我尝试调试它时,我注意到它归结为我的
rchit.glsl
(射线最近命中)代码并且与hitAttributeEXT
变量有关。在将其分解为最简单的可重现场景后,我变得目瞪口呆,每当对所述参数执行计算时,我都会得到莫名其妙的图形输出。
#version 460
#extension GL_EXT_ray_tracing : require
#extension GL_EXT_nonuniform_qualifier : enable
#extension GL_EXT_scalar_block_layout : enable
layout(location = 0) rayPayloadInEXT vec3 hitValue; // This is simply the resulting output
hitAttributeEXT vec2 attribs; // barycentric coordinates of the triangle hit by a ray
void main()
{
// For testing purposes I either uncommented or commented out a separate section
// Raytracing Shader Test 1
// setting hit value directly as attribs (this works as expected)
hitValue = vec3(1.0, attribs);
// Raytracing Shader Test 2
// Adding a branch (this does not work as expected)
if (attribs.x > 0.5)
{
hitValue = vec3(1.0, 1.0, 1.0);
} else {
hitValue = vec3(0.0, 0.0, 0.0);
}
// Raytracing Shader Test 3
// fixed value for sanity check
hitValue = vec3(0.0, 1.0, 0.0);
}
在下面,我用一个投影的 ico-sphere 做了几个测试。
所以这里的事情似乎按预期工作,三角形在一个角上有红色,在另一个角上有红色+蓝色=紫色,在最后一个角上有红色+绿色=黄色。
所以这让我很困惑,在我的着色器设置下,我什至看不出红色是怎么可能的。
使用恒定的颜色输出
只是在某些情况下,这就是对象在光栅化渲染器下的真实外观。
一些额外的信息
Vulkan 版本:
“vulkan-headers/1.3.211.0”,
“vulkan-loader/1.3.211.0”,
“vulkan-validationlayers/1.3.211.0”,
来自 VulkanSDK-1.3.211.0 的 glslc:
$ glslc --version
shaderc v2022.1 v2022.1
spirv-tools v2022.2-dev v2022.1-61-geed5c76a
glslang 11.1.0-457-gabbe4664
Target: SPIR-V 1.0
glslc 命令:
glslc --target-env=vulkan1.3 rayhit_shader.rchit -o rayhit_shader.spv