我可以将R8G8B8A8放在UBO中,并将其用作ve4吗? [英] Can I put a R8G8B8A8 in a UBO, and use it as a vec4?
本文介绍了我可以将R8G8B8A8放在UBO中,并将其用作ve4吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我尝试优化工作的计算着色器。它的目的是创建一个图像:找到好的颜色(使用一个小调色板),然后调用imageStore(image, ivec2, vec4)
。
- 颜色在统一缓冲区的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));
}
我想清理/优化一点,因为这个颜色转换在着色器中看起来很差/没有用(应该是预计算的)。我的问题是:
- 是否可以使用4个字节(如R8G8B8A8)直接将
vec4(r, g, b, 0.0)
打包到UBO内?
推荐答案
是否可以直接执行?编号
但是GLSL确实有许多用于打包/解包规格化值的函数。在本例中,您可以将该值作为单个uint
uniform
传递,然后使用unpackUnorm4x8
将其转换为vec4
。因此,您的代码变为:
vec4 color = unpackUnorm4x8(material.rgb);
当然,这是内存与性能之间的折衷。因此,如果内存不是问题,您可能只需要直接传递一个
vec4
(never use vec3
)。
这篇关于我可以将R8G8B8A8放在UBO中,并将其用作ve4吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文