Graphics 以8位浮点(cg)编码数据

Graphics 以8位浮点(cg)编码数据,graphics,encoding,floating-point,cg,rgba,Graphics,Encoding,Floating Point,Cg,Rgba,语言是cg 我有一个8位浮点,它必须介于0和1之间(它是float4 rgba颜色值的“a”分量)。我想在其中存储一个6位无符号整数和一个2位无符号整数。如何将这两个值安全地存储在这8位中 我找不到任何关于8位浮点格式的文档,尤其是限制在0和1之间的文档。我假设它比仅仅数据/255?更复杂,OpenGL标准保证在写入8位帧缓冲区时至少保留256个不同的值。我敢肯定Cg也会这么做 因此,您应该能够以这种方式编写两个值: output.a = (4.0 * clamp(val1, 0.0, 63.0

语言是cg

我有一个8位浮点,它必须介于0和1之间(它是float4 rgba颜色值的“a”分量)。我想在其中存储一个6位无符号整数和一个2位无符号整数。如何将这两个值安全地存储在这8位中


我找不到任何关于8位浮点格式的文档,尤其是限制在0和1之间的文档。我假设它比仅仅
数据/255

更复杂,OpenGL标准保证在写入8位帧缓冲区时至少保留256个不同的值。我敢肯定Cg也会这么做

因此,您应该能够以这种方式编写两个值:

output.a = (4.0 * clamp(val1, 0.0, 63.0)
                + clamp(val2, 0.0, 3.0)) / 255.0;
然后像这样检索它们:

float val1 = floor(input.a * 255.0 / 4.0);
float val2 = fmod(input.a * 255.0, 4.0);

这相当于对整数的逐位操作。

OpenGL标准保证在写入8位帧缓冲区时至少保留256个不同的值。我敢肯定Cg也会这么做

因此,您应该能够以这种方式编写两个值:

output.a = (4.0 * clamp(val1, 0.0, 63.0)
                + clamp(val2, 0.0, 3.0)) / 255.0;
然后像这样检索它们:

float val1 = floor(input.a * 255.0 / 4.0);
float val2 = fmod(input.a * 255.0, 4.0);

这相当于对整数进行逐位运算。

如果不知道您的目标是什么浮点格式,很难说出任何内容。@OliCharlesworth:这就是问题所在,我不知道这种格式是如何存储在cg中的。如果不知道你想要的是什么浮点格式,很难说出任何事情。@OliCharlesworth:这就是问题所在,我不知道这种格式是如何存储在cg中的。你的意思是我只是将浮点设置为整数吗?当我尝试它时,它只是将我的值限制在0和1之间,所以我无法检索它。还是我在这里遗漏了什么?我不确定我是否明白。我以为您有8位信息要从CPU传递到GPU,数据通道是
float4
的第四个组件。如果是这样,我建议将这8位编码为0-255整数,将其传递到GPU,在GPU中,它将由DirectX或OpenGL(您需要这样做)标准化为0-1,最后在着色器中乘以255.0。否则,您可以解释一下您在GPU和CPU上使用的数据格式吗?我所有的计算都在cg着色器中-我正在对照明过程之间的值进行编码。在我的基本过程中,我需要向每个像素写入一个32位RGBA值。我想存储组件中每个像素的自定义数据。在另一个光照过程中,我想检索数据,给定RGBA值。好的,我想我理解得更好。我相应地修改了我的答案。谢谢,我想就这样了!你是说我只是把浮点设为整数?当我尝试它时,它只是将我的值限制在0和1之间,所以我无法检索它。还是我在这里遗漏了什么?我不确定我是否明白。我以为您有8位信息要从CPU传递到GPU,数据通道是
float4
的第四个组件。如果是这样,我建议将这8位编码为0-255整数,将其传递到GPU,在GPU中,它将由DirectX或OpenGL(您需要这样做)标准化为0-1,最后在着色器中乘以255.0。否则,您可以解释一下您在GPU和CPU上使用的数据格式吗?我所有的计算都在cg着色器中-我正在对照明过程之间的值进行编码。在我的基本过程中,我需要向每个像素写入一个32位RGBA值。我想存储组件中每个像素的自定义数据。在另一个光照过程中,我想检索数据,给定RGBA值。好的,我想我理解得更好。我相应地修改了我的答案。谢谢,我想就这样了!