我尝试优化工作计算着色器。它的目的是创建一个图像:找到合适的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4)
.
- 颜色在 UniformBuffer 的 uint 数组中进行索引。
- 该 UBO 中的一种颜色封装在一个 uint 中,如 {0-255, 0-255, 0-255, 0-255}。
这里是代码:
struct Entry
{
*some other data*
uint rgb;
};
layout(binding = 0) uniform SConfiguration
{
Entry materials[MATERIAL_COUNT];
} configuration;
void main()
{
Entry material = configuration.materials[currentMaterialId];
float r = (material.rgb >> 16) / 255.;
float g = ((material.rgb & G_MASK) >> 8) / 255.;
float b = (material.rgb & B_MASK) / 255.;
imageStore(outImage, ivec2(gl_GlobalInvocationID.xy), vec4(r, g, b, 0.0));
}
我想清理/优化一下,因为这种颜色转换在着色器中看起来很糟糕/无用(并且应该预先计算)。我的问题是:
- 可以直接打包吗
vec4(r, g, b, 0.0)
在 UBO 内部,使用 4 个字节(如 R8G8B8A8)?
直接做可以吗?不。
但 GLSL 确实有许多用于打包/解包标准化值的函数。在您的情况下,您可以将该值作为单个值传递uint
uniform
,然后使用unpackUnorm4x8
将其转换为vec4
。所以你的代码变成:
vec4 color = unpackUnorm4x8(material.rgb);
当然,这是内存与性能的权衡。因此,如果内存不是问题,您可能应该通过vec4
(从不使用vec3) 直接地。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)