Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
OpenGL如何转换单组件纹理?_Opengl - Fatal编程技术网

OpenGL如何转换单组件纹理?

OpenGL如何转换单组件纹理?,opengl,Opengl,我对OpenGL如何存储单个组件纹理(如GL_-RED)感到困惑 GL将其转换为浮点,并通过附加0表示绿色和蓝色,附加1表示alpha,将其组装为RGBA元素 这是否意味着我的纹理将在图形内存中占用32 bpp,即使我只占用8 bpp 我还想知道OpenGL如何将字节转换为浮点值,以便在着色器中进行操作。简单地除以255似乎不符合逻辑。你不知道,你也没有办法知道(好吧,好吧,我有点撒谎了……存在着告诉你某些特定硬件的细节。但一般来说,你没有办法知道,因为你事先不知道你的程序将在什么硬件上运行)

我对OpenGL如何存储单个组件纹理(如GL_-RED)感到困惑

GL将其转换为浮点,并通过附加0表示绿色和蓝色,附加1表示alpha,将其组装为RGBA元素

这是否意味着我的纹理将在图形内存中占用32 bpp,即使我只占用8 bpp


我还想知道OpenGL如何将字节转换为浮点值,以便在着色器中进行操作。简单地除以255似乎不符合逻辑。

你不知道,你也没有办法知道(好吧,好吧,我有点撒谎了……存在着告诉你某些特定硬件的细节。但一般来说,你没有办法知道,因为你事先不知道你的程序将在什么硬件上运行)

OpenGL在某种程度上按照您的要求存储纹理,但它最终选择了硬件支持的东西。如果这意味着它将您的输入数据转换为完全不同的内容,那么它将以静默方式进行转换

例如,大多数实现将RGB转换为RGBA,因为这样更方便内存访问。5-5-5数据转换为8-8-8和类似数据也是如此

通常,现在8bpp的纹理每像素只需要1个字节(因为几乎每一张卡都支持这一点,对于软件实现来说这并不重要),尽管这不是你可以100%依赖的东西。不过,你也不必担心。。。它将确保它以某种方式工作

顺便说一句,两种纹理的非幂也会发生类似的情况。在所有现代版本的OpenGL上,这都是受支持的(如果我没记错的话,从2.0开始)。不过,至少在理论上,一些旧卡可能不支持此功能。

在这种情况下,OpenGL只会默默地将纹理变成两个大小的下一个更大的幂,并且只使用其中的一部分(不告诉您!)。

谢谢您的回复。你知道当你在着色器中使用8位颜色值时,OpenGL是如何将它们转换为浮点值的吗?从概念上讲,只需除以255。。。但我不知道到底是除法还是查表。看到256个条目的查找表是多么的便宜,除法是多么的昂贵,我会假设查找表。Gamma校正通常也适用于查找表,而不是真正使用
pow
。好的,谢谢!我在想可能是加1除以256,因为除以255=精度损失。实际上并不是那么简单,请参阅“本文讨论实数范围[-1,1]到p位有符号整数范围的标量量化”——这是另一回事。不同的区间,更广义。但是,是的,对于在不受零限制的区间内具有任意位长度的一般解,情况确实变得更加复杂。