OpenGL纹理缓冲区-GLSL语法

OpenGL Texture Buffer - GLSL Syntax

本文关键字:语法 -GLSL 缓冲区 纹理 OpenGL      更新时间:2023-10-16

假设我只想渲染四边形并且可以重用我的网格,我希望能够在一个draw调用中渲染多个实例。

我想通过将变换矩阵放置到缓冲区中,使用纹理缓冲区对象来实现这一点。

我知道如何在C++中设置纹理缓冲区对象,但对如何在GLSL中获取转换感到困惑。

uniform samplerBuffer sampler;
...
... = texelFetch( sampler, index );

在上面的代码中(在顶点着色器中),我不确定samplerBuffer关键字是如何工作的(并且在查找文档时遇到了很多困难)。我想知道给定顶点与纹理缓冲区中的哪个索引相关联,这样就可以进行变换查找。我该怎么做?GLSL语法会是什么样子?

可以假设变换矩阵是4x4矩阵。我希望能够将OpenGL的版本要求保持在2.XX的范围内。

编辑:所以我发现了这个:http://www.opengl.org/registry/specs/ARB/draw_instanced.txt.我可以处理3.0的限制。然而,当我查找如何使用它的示例时,我感到困惑。使用GLEW,我想我会调用glDrawElementsInstated,但互联网上的一些地方说这需要OpenGL 3.3或更高版本。如何利用我链接的3.0要求?

缓冲区纹理本质上是存储在缓冲区对象(TEXTURE_BUFFER)数据存储中的1D数据数组。您提供一个整数,它本质上是缓冲区中的偏移量,并从该偏移量开始获取具有texelFetch的单个texel。偏移总是指纹素,而不是指纹素的单个分量(例如vec4R-分量)。因此,如果使用内部格式GL_R设置缓冲区纹理,则会查找仅存储单个值的单个texel,但是,如果使用GL_RGBA,则texel将由四个组件组成。

例如,假设您选择将具有RGBA组件的两个标准化颜色向量放入数据存储中,选择内部格式GL_RGBA并使用0和1进行索引,您将根据核心OpenGL 4.4规范的第8.9节从缓冲区纹理中获得第一个和第二个纹素

[..]附加缓冲区对象的数据存储被解释为与internalformat相对应的GL数据类型的元素数组。每个纹素由一到四个元素组成,这些元素被映射到纹理组件(R、G、B和A)。

请注意,texelFetch始终返回gvec4,即ivec4uivec4vec4,具体取决于内部格式。如果选择指定少于四个组件的内部格式,例如GL_R32F,结果将是未规范化(<-这很重要!)vec4(R, 0, 0, 1)-剩余的GB组件设置为零,A设置为1。有关完整概述,请参见上述规范的表8.15

还要注意,texelFetch不执行任何滤波或LOD箝位。

所有版本的texelFetch都返回gvec4,所以我认为应该执行4次查找,每行1次。但这取决于你如何编码你的矩阵。

uniform samplerBuffer sampler;
...
mat4 transform( texelFetch( sampler, RowIndex0 ), texelFetch( sampler, RowIndex1 ), texelFetch( sampler, RowIndex2 ), texelFetch( sampler, RowIndex3 ) ); 

请记住,GLSL中的mat4在构造函数中采用列,因此如果使用基于列的矩阵,则需要对其进行转置。