使用 glTexBuffer 和 texelFetch 的 OpenGL(带 GLSL)

Posted

技术标签:

【中文标题】使用 glTexBuffer 和 texelFetch 的 OpenGL(带 GLSL)【英文标题】:OpenGL(with GLSL) using glTexBuffer and texelFetch 【发布时间】:2013-12-19 12:04:48 【问题描述】:

尝试在 OpenGL 桌面中渲染一个矩形,但 glTexBuffer(...) 中使用的内部格式和 texelFetch(...) 的相应代码对我不起作用。我有正确的原始渲染,只需要更正纹理缓冲区部分。下面是相关代码sn -p


unsigned char texData [16] = 
     
        255, 0, 0, 0, //Red 
        0,255,0,255, //Green 
        0,0,255,255, //Blue 
        255,0,255,255, //PINK
    ; 
    glGenBuffers( 2,texBuffObj);
    glBindBuffer( GL_TEXTURE_BUFFER,texBuffObj[0]);
    glBufferData( GL_TEXTURE_BUFFER,sizeof(texData),texData,GL_DYNAMIC_DRAW);
    glGenTextures(1, &textureID);
    glBindTexture(GL_TEXTURE_BUFFER, textureID);
    glTexBuffer(GL_TEXTURE_BUFFER,GL_RGBA8UI,texBuffObj[0]);

Fragement Shader Snippet: #version 330 core uniform usamplerBuffer samplerTexBuffer; out vec4 color; in vec2 vs_texCoord; in vec3 vert_Color; void main() int offset = 8; // 0:RED 4:GREEN 8:BLUE 12:PINK vec4 colBuff; colBuff = texelFetch(samplerTexBuffer,offset) ; color = colBuff;


所需的渲染是这样的:

偏移值 0 原始颜色 : 255, 0, 0, 0, //Red 偏移值 4 原始颜色 : 0, 255, 0, 255, //Green 偏移值 8 原始颜色 : 0, 0, 255, 255, //Blue 偏移值 12 原始颜色 : 255, 0, 255, 255, //PINK


需要进行哪些必要的更正?

【问题讨论】:

【参考方案1】:

texelFetch 采用纹理坐标,而不是缓冲区中的字节偏移量。由于您的纹素是 4 字节宽,因此您希望使用索引 0、1、2、3 而不是 0、4、8、12 来检索它们。

【讨论】:

成功了!让我感到困惑的是枚举值和各自的 texData,我可以假设对于 GL_R32F,texData 应该是一个浮点数组,其中每个元素仅提供 R 值吗? @ppu 没错,你仍然可以使用纹素坐标获取纹素(0 表示第一个红色值的纹素,1 表示第二个红色值的纹素,等等)

以上是关于使用 glTexBuffer 和 texelFetch 的 OpenGL(带 GLSL)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 php 和 mysql 使用纬度和经度进行几何搜索

Cocoa - 为啥使用 NSInteger 和 CGFloat 而不是使用 int 和 float,或者总是使用 NSNumber?

HTTPS和SSH方式的区别和使用

学习和使用SVN和GitHub——开篇

CPU使用率和正在使用的内存之间有啥关系?

使用 Express 和 GraphQL 而不是简单地使用 Node.js 和 GraphtQL 有啥好处?