我可以将R8G8B8A8放在UBO中,并将其用作ve4吗? [英] Can I put a R8G8B8A8 in a UBO, and use it as a vec4?

查看:0
本文介绍了我可以将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确实有许多用于打包/解包规格化值的函数。在本例中,您可以将该值作为单个uintuniform传递,然后使用unpackUnorm4x8将其转换为vec4。因此,您的代码变为:

    vec4 color = unpackUnorm4x8(material.rgb);

当然,这是内存与性能之间的折衷。因此,如果内存不是问题,您可能只需要直接传递一个vec4(never use vec3)。

这篇关于我可以将R8G8B8A8放在UBO中,并将其用作ve4吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆