OpenGL,单通道32位纹理或TBO中的灰度/颜色映射图像的32位(int)缓冲区?

克里斯佩珀1989

我有一个强度值的int缓冲区,我想在OpenGL中将其显示为灰度/彩色映射图像。

实现此目标的最佳方法是什么?

标准纹理?

我可以通过标准的glTexture来做到吗,就像这样:

gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_R32f, width, height, 0, OpenGL.GL_RED_INTEGER, OpenGL.GL_UNSIGNED_INT, pixels);

在着色器中,我的印象是,我将使用它与其他任何纹理相同的东西,除了我将使用usampler2D而不是sampler2D,此时我将获得真实的整数值(即不在0-1范围内)。

TBO?

还是通过TBO并执行类似的操作会更好:

gl.TexBuffer(OpenGL.GL_TEXTURE_BUFFER, OpenGL.GL_R32F, bufferID);

就着色器而言,我实际上很困惑。我看过类似g = texelFetch(u_tbo_tex,offset + 1).r的东西所以我猜我将不得不将纹理坐标转换为偏移量,例如:

int offset = tex_coord.s + (tex_coord.t * imageWidth);

但是后来texelFetch实际上返回了vec4,所以大概我会使用:

int intensity = texelFetch( buffer,  offset).r 

但是,由于tex_coord.s&t在0-1中,则意味着需要:

int offset = tex_coord.s*imageHeight + ((tex_coord.t * imageWidth) * imageWidth);

其他缓冲区

我对缓冲区对象的经验很少,我觉得我实际上所做的就是在GL中使用缓冲区...。因此,我确实觉得我已经使它过于复杂了,并且我错过了“ penny drop”。

重要笔记

  • 为什么要诠释?:在某些情况下,我会先对数据进行一些处理,然后再将颜色转换为彩色,因此最好以32位精度进行操作,以避免潜在的精度错误。可以说它可能并没有什么不同,因为它最终变成了屏幕颜色。
  • 数据更新频率:强度数据偶尔会因用户事件而更新,但肯定不会每帧多次更新(因此,我认为在这种情况下,STATICDYNAMIC更合适吗?)
  • 使用:数据主要用于GL,因此_DRAW应用程序可能会使用GL为它计算一些值,但是在这种情况下,我可能会创建一个单独的READ缓冲区
  • 到目前为止,我看到的最大整数值为“ 90,000”,因此我知道它超出了16位整数范围。

注意:我正在通过SharpGL进行此操作,目前无法测试,因为它没有GL_R32f的定义,因此我将不得不在Windows平台上找到gl.h(总是很有趣)并添加正确的const编号。 *

BDL

您可以使用具有整数/无符号整数格式的普通纹理:

 gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_R32UI, width, height, 0, OpenGL.GL_RED_INTEGER, OpenGL.GL_UNSIGNED_INT, pixels);

在着色器中,您可以使用usampler2D,因为纹理函数对此有一个重载,您可以直接获取整数值:

 uniform usampler myUTexture;
 uint value = texture(myUTexture, texCoord).r;

编辑:仅出于完整性:texelFetch对所有类型的2d采样器也有重载。Texture和texelFetch之间的区别是所使用的坐标系(对于[texelFetch],纹理和像素坐标为[0,1]),并且texelFetch不考虑任何插值/ mipmap。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在适用于iOS的OpenGl ES 2.0中写入单通道像素缓冲区

来自分类Dev

从char缓冲区读取32位变量

来自分类Dev

如何获得WGL创建32位深度的缓冲区?

来自分类Dev

OpenGL ES2.0将8位图像加载到模板缓冲区中

来自分类Dev

OpenGL ES2.0将8位图像加载到模板缓冲区中

来自分类Dev

如何在数组缓冲区中存储32位整数?

来自分类Dev

OpenGL 16位模板缓冲区?

来自分类Dev

C ++中的位缓冲区

来自分类Dev

检测颜色的圆圈会在OpenCV中显示“图像必须在HoughCircle中为8位单通道”错误

来自分类Dev

OpenGL:清除模板缓冲区,除了某些位?

来自分类Dev

在Win32中显示带有Alpha通道的32位图像

来自分类Dev

将16位单通道图像写入Tiff

来自分类Dev

将16位单通道图像写入Tiff

来自分类Dev

NodeJS缓冲区从字节读取位

来自分类Dev

3位数字的缓冲区

来自分类Dev

openGL单通道纹理始终采样0

来自分类Dev

将缓冲区中的数据压缩为每个元素16位到12位

来自分类Dev

在OpenGL ES 2.0中生成和更新8位灰度级纹理

来自分类Dev

在OpenGL ES 3.0上对32位整数或浮点纹理进行纹理过滤

来自分类Dev

在C中构造32位unsigned int

来自分类Dev

从32位JPG变为14位灰度我的数学是错误的

来自分类Dev

如何从OpenGL中的帧缓冲区纹理中采样像素?

来自分类Dev

在OpenGL ES 2.0中,将FBO与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用

来自分类Dev

OpenGL纹理缓冲区对象的目的是什么?

来自分类Dev

OpenGL:帧缓冲区-绘制纹理-glClearColor

来自分类Dev

OpenGL纹理缓冲区对象的目的是什么?

来自分类Dev

WebGL:同时使用纹理和颜色缓冲区

来自分类Dev

C#无法使用正确的颜色映射显示RAW16灰度图像

来自分类Dev

协议缓冲区负int32 / int64编码器的规格模糊

Related 相关文章

  1. 1

    在适用于iOS的OpenGl ES 2.0中写入单通道像素缓冲区

  2. 2

    从char缓冲区读取32位变量

  3. 3

    如何获得WGL创建32位深度的缓冲区?

  4. 4

    OpenGL ES2.0将8位图像加载到模板缓冲区中

  5. 5

    OpenGL ES2.0将8位图像加载到模板缓冲区中

  6. 6

    如何在数组缓冲区中存储32位整数?

  7. 7

    OpenGL 16位模板缓冲区?

  8. 8

    C ++中的位缓冲区

  9. 9

    检测颜色的圆圈会在OpenCV中显示“图像必须在HoughCircle中为8位单通道”错误

  10. 10

    OpenGL:清除模板缓冲区,除了某些位?

  11. 11

    在Win32中显示带有Alpha通道的32位图像

  12. 12

    将16位单通道图像写入Tiff

  13. 13

    将16位单通道图像写入Tiff

  14. 14

    NodeJS缓冲区从字节读取位

  15. 15

    3位数字的缓冲区

  16. 16

    openGL单通道纹理始终采样0

  17. 17

    将缓冲区中的数据压缩为每个元素16位到12位

  18. 18

    在OpenGL ES 2.0中生成和更新8位灰度级纹理

  19. 19

    在OpenGL ES 3.0上对32位整数或浮点纹理进行纹理过滤

  20. 20

    在C中构造32位unsigned int

  21. 21

    从32位JPG变为14位灰度我的数学是错误的

  22. 22

    如何从OpenGL中的帧缓冲区纹理中采样像素?

  23. 23

    在OpenGL ES 2.0中,将FBO与纹理深度缓冲区一起使用时,深度纹理缓冲区不起作用

  24. 24

    OpenGL纹理缓冲区对象的目的是什么?

  25. 25

    OpenGL:帧缓冲区-绘制纹理-glClearColor

  26. 26

    OpenGL纹理缓冲区对象的目的是什么?

  27. 27

    WebGL:同时使用纹理和颜色缓冲区

  28. 28

    C#无法使用正确的颜色映射显示RAW16灰度图像

  29. 29

    协议缓冲区负int32 / int64编码器的规格模糊

热门标签

归档