OpenGL图像中的格式转换

时间:2015-05-07 19:55:55

标签: c++ opengl opengl-es

似乎我对与图像加载/存储相关的OpenGL格式转换感到困惑。 我来自DX世界,事情相对清晰。例如:

  1. 您可以使用某种特定格式(例如RGBA32_FLOAT
  2. 创建纹理
  3. 您在着色器RWTexture2D<float4>中声明与格式
  4. 匹配的RW纹理
  5. 您对纹理进行读/写
  6. 您还可以将RGBA8_UNORM纹理绑定到RWTexture2D<float4>,DirectX将以明显清晰的方式执行格式转换。

    现在说我想在OpenGL中做同样的事情。所以我

    1. 使用GL_RGBA32F内部格式创建GL纹理
    2. 在我的着色器中,我声明layout(rgba32f) uniform image2D myImg;
    3. 我使用glBindImageTexture( ..., GL_RGBA32F);
    4. 将纹理绑定到着色器中的图像

      所以我计算了四个指定格式的地方:

      1. 当我创建纹理时
      2. 宣布图像单位时两次:

        • layout(rgba32f)
        • image2D本身告诉我所有加载/存储操作都需要vec4(不是ivec4uvec4
      3. 当我使用glBindImageTexture

      4. 绑定图片时

        我无法理解layout(rgba32f)的目的是什么,这似乎完全是多余的。似乎知道内部纹理格式足以执行所有格式转换。如果我的内部纹理格式规范化RGBA8并且图像定义为uniform image2D myImg;,我需要指定哪种布局?为什么我需要指定布局,不清楚应该执行什么样的格式转换? 我唯一能够证明这些布局的理念是执行数据重新解释,例如将原始RGBA32F数据写入RGBA32U纹理,这对我来说似乎并不是很有用。此外,你还有像floatBitsToInt()这样的功能。

        将格式传递给glBindImageTexture的目的是什么,对我来说是个完全谜。

        所以这些布局对我来说是一个巨大的混乱源。你能帮我更好地理解他们背后的原因吗?

1 个答案:

答案 0 :(得分:1)

  

将格式传递给glBindImageTexture的目的是什么,对我来说是个完全谜。

在GL中,人们经常可以在&#34;问题&#34;中找到特定API决策背后的推理。相关扩展规范的部分。在这种情况下, GL_ARB_shader_image_load_store扩展程序的第31期可能会 乐于助人:

  

(31)为什么format上有BindImageTexture参数?

     

已解决:它允许一些比特流,以查看纹理   同         一种格式使用另一种格式。除了任何好处         查看具有不同格式的纹理,它也允许原子         通过允许它们对一些多组件纹理进行操作         使用R32IR32UI格式查看。

     

EXT_shader_image_load_store扩展程序中,还有一个附加内容         有利于解决对格式集的更严格限制         商店支持 - 仅限R8R16R32FRG32FRGBA32F等格式         在那里得到支持。其他不支持的格式可以视为         支持的格式(例如,RGBA8可以映射到R32UI),使用着色器代码         做任何需要的包装和拆包。

因此,应该将内部纹理格式和图像格式视为两个不同的东西。它们必须兼容,但它们不必匹配。

  

我无法理解layout(rgba32f)的目的是什么,这似乎完全是多余的。似乎知道内部纹理格式足以执行所有格式转换。

图像的内部格式(不是纹理)可能已足够 - 但该信息不是着色器状态的一部分,并且未知着色器编译时间。 GL并没有将用户的背后隐藏起来。布局限定符中的格式必须与完全匹配关联图像单元的格式,否则结果将不确定。着色器只会以指定的格式读取或写入数据,如果与实际数据不匹配,您就会被搞砸,规格也不能保证。

  

如果我的内部纹理格式是规范化的RGBA8并且图像被定义为uniform image2D myImg,我需要指定什么布局;

layout(rgba8)是根据规范允许的唯一一个。

  

我唯一能够证明这些布局的理念是执行数据重新解释,例如将原始RGBA32F数据写入RGBA32U纹理,这对我来说似乎没有用。

你真的倒退了。 layout(format)不允许重新解释,format的{​​{1}}参数至少以有限的方式进行重新解释。