我有一个强度值的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”。
重要笔记
注意:我正在通过SharpGL进行此操作,目前无法测试,因为它没有GL_R32f的定义,因此我将不得不在Windows平台上找到gl.h(总是很有趣)并添加正确的const编号。 *
您可以使用具有整数/无符号整数格式的普通纹理:
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] 删除。
我来说两句