【问题标题】:opengl texture format for floating-point gpgpu浮点gpgpu的opengl纹理格式
【发布时间】:2014-06-08 04:55:00
【问题描述】:

我希望使用 glsl 处理图像。例如 - 对于每个像素,输出其平方值: (r,g,b)-->(r^2,g^2,b^2)。然后我想使用 glReadPixels 将结果读入 cpu 内存。

这应该很简单。但是,我发现的大多数 glsl 示例都解释了用于图像后处理的着色器;因此,它们的输出值已经位于 [0,255]。但是,在我的示例中,我想获得 [0^2,255^2] 范围内的输出值;而且我不希望它们标准化为 [0,255]。

我的代码的主要部分是(经过一些试验和排列):

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_BGR, GL_FLOAT, NULL);
glReadPixels(0, 0, width, height, GL_RGB, GL_FLOAT, data_float); 

我没有发布我的整个代码,因为我认为这两行是我的问题所在。

编辑

遵循@Arttu 的建议,并遵循this postthis post my 的代码现在如下所示:

glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA32F_ARB, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glReadPixels(0, 0, width, height, GL_RGB, GL_FLOAT, data_float);

不过,这并不能解决我的问题。如果我理解正确 - 无论如何,当我插入它们时,我的输入值都会缩放到 [0,1]。以后乘以 255 或 255^2 由我决定...

【问题讨论】:

    标签: opengl textures glsl gpgpu


    【解决方案1】:

    使用浮点纹理格式将使您的值保持不变,而不会将它们限制在任何特定范围内(在这种情况下,当然是在 16 位浮点表示的限制内)。您没有指定您的 OpenGL 版本,因此假定为 4.3。

    您的 formatinternalformat 似乎有冲突。您指定的是内部格式 RGBA16F,但格式为 BGR,没有 alpha 组件 (glTexImage2D man page)。请尝试以下操作:

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_BGRA, GL_FLOAT, NULL);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, data_float);
    

    在第一行中,您指定了具有四分量、16 位浮点格式的 2D 纹理,OpenGL 将期望纹理数据为 BGRA 格式。由于您将 0 作为最后一个参数,因此您没有指定任何图像数据。请记住,RGBA16F 格式会在着色器中为您提供 half 值,如果您将值分配给 floatvec* 变量,这些值将被隐式转换为 32 位格式。

    在第二行,您将图像数据从设备下载到data_float,这次是按 RGBA 顺序。

    如果这不能解决您的问题,您可能需要添加更多代码。此外,将glGetError 调用添加到您的代码中将帮助您找到导致错误的调用。祝你好运:)

    【讨论】:

    • 感谢您的回复。但是,我不确定您是否必须阅读 rgba,但您也可以阅读 rgb。尽管如此,标准化是困扰我的事情。在我编辑的问题中查看相关帖子。
    • 您是否按照here 的指示为读取、顶点和片段目标禁用了glClampColor
    • 另外,您可以尝试使用GL_RGBA32F,以防出现与 16F 格式相关的驱动程序错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多