gpt4 book ai didi

c - 在顶点着色器中将 4 个以上的组件打包到 RGBA_32 纹理中

转载 作者:太空宇宙 更新时间:2023-11-04 04:39:21 25 4
gpt4 key购买 nike

问题:

  • Vertex Shader 只能从非 mipmapped RGBA_32 图像(128 位浮点)中获取纹素
  • 我需要每个顶点超过 4 个值
  • 使用多个 RGBA_32 图像有点矫枉过正(我猜),至少我不需要每个组件都那么精确)

所以我需要一种方法将 4 个以上的组件打包到 4 个 RGBA 值中,当然还需要一种方法将这些组件解包到顶点着色器中。

我需要的一些组件:

  • RGBA 颜色(32 位)
  • 位置(每个组件 16 位,所以总共 48 位)
  • 正常(??位)

性能不是问题(好吧,我认为任何解包函数都比对 RGBA_32 纹理采样两次更好,还因为这些纹理很大,每个额外的纹理都会占用几十 MB!)

打包必须在片段着色器(假设使用渲染目标)和可移植 C 代码(需要时从 CPU 更新部分纹理)中进行。

最佳答案

如何使用每个 channel 精度小于 8 位的多个图像?例如,类型为 GL_UNSIGNED_SHORT_4_4_4_4 且内部格式为 RGBA4(即每个 channel 4 位)的两张 RGBA 图像。

另一种可能性是打包位。例如,两个半字节可以打包成一个八位字节。因此,使用 R8_G8_B8_A8(即 GL_RGBA8)纹理,您可以编码 16 个元素。

打包组件

uint8_t pack_nibbles(unsigned a, unsigned b) {
return (a & 0x0f) | ((b & 0x0f) << 4);
}

解压

ivec2 unpack_nibbles2(int c) {
return ivec2(c & 0x0f, (c >> 4) & 0x0f);
}

ivec4 unpack_nibbles4(ivec2 c) {
return ivec4(c.x & 0x0f, (c.x >> 4) & 0x0f,
c.y & 0x0f, (c.y >> 4) & 0x0f);
}

后者可以像这样使用

uniform usampler2D tex;

/* ... */

ivec4 t = texture(tex, ...);
ivec4 a = unpack_nibbles4(t.xy);
ivec4 b = unpack_nibbles4(t.wz);

关于c - 在顶点着色器中将 4 个以上的组件打包到 RGBA_32 纹理中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27998987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com