【问题标题】:OpenGL Texture Buffer - GLSL SyntaxOpenGL 纹理缓冲区 - GLSL 语法
【发布时间】:2013-12-10 08:47:26
【问题描述】:

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

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

我了解如何在 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,我想我会调用 glDrawElementsInstanced,但互联网上的一些地方说这需要 OpenGL 3.3 或更高版本。如何利用我链接的 3.0 要求?

【问题讨论】:

  • 您还可以使用更适合多个矢量和矩阵块上传的统一缓冲区。

标签: c++ opengl glsl batch-processing


【解决方案1】:

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

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

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

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

另请注意,texelFetch 不执行任何过滤或 LOD 钳制。

【讨论】:

  • 非常感谢您的回答。我还在底部对我的问题进行了小幅编辑,也许你可以帮忙?我只是对版本要求感到困惑。
  • 实例化渲染成为 GL 3.1 的核心,因此与该功能相关的任何内容,包括相应的绘制调用,都将由符合 GL 3.1 的实现支持。如果您坚持使用 GL 3.0,您仍然可以检查 GL_ARB_draw_instanced 是否可用,只需使用 ARB 版本即可。如果您想确定 GL 版本中的新内容,请查看相应的附录 - 对于 GL3,它是核心 GL 3.3 规范中的附录 F 到 I。
【解决方案2】:

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

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

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

【讨论】:

  • 我希望我能接受这两个答案!不得不选择另一个,因为他有更多关于数据格式的有用信息。无论如何,谢谢你,我赞成:)
  • @RandyGaul:我给了他一个赞成票,所以差别只有 5 个代表。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 2011-11-24
  • 2015-11-15
  • 2011-05-22
  • 1970-01-01
  • 2014-01-06
  • 2015-07-29
相关资源
最近更新 更多