[英]OpenGL Texture Buffer - GLSL Syntax
假设我只想渲染四边形并且可以重用我的网格,我希望能够在一个绘制调用中渲染许多实例。
我想通过将转换矩阵放置到缓冲区中来使用纹理缓冲区对象来实现此目的。
我了解如何在C ++中设置纹理缓冲区对象,但对如何在GLSL中从中获取转换感到困惑。
uniform samplerBuffer sampler;
...
... = texelFetch( sampler, index );
在上面的代码中(在顶点着色器中),我不确定samplerBuffer
关键字的工作方式(并且在查找文档时遇到很多麻烦)。 我想知道给定顶点与纹理缓冲区中的哪个索引相关联,这样可以进行转换查找。 我该怎么做?GLSL语法是什么样的?
可以假设变换矩阵是4×4矩阵。 我希望能够将OpenGL版本要求保持在2.XX范围内。
编辑:所以我找到了这个: http : //www.opengl.org/registry/specs/ARB/draw_instanced.txt 。 我可以处理3.0的限制。 但是,在查找有关如何使用此方法的示例时,我感到困惑。 我想使用GLEW,我会调用glDrawElementsInstanced,但是互联网上的某些地方说这需要OpenGL 3.3或更高版本。 如何利用我链接的3.0要求?
好吧,缓冲区纹理本质上是存储在缓冲区对象( TEXTURE_BUFFER
)数据存储区中的一维数据数组。 您提供一个整数,它实际上是缓冲区的偏移量,并从该偏移量开始使用texelFetch
提取单个texel。 偏移量始终是指纹素,而不是纹素的单个成分(例如vec4
的R
成分)。 因此,如果使用内部格式GL_R
设置缓冲区纹理, GL_R
查找仅存储单个值的单个纹理像素-但是,如果使用GL_RGBA
,则纹理像素将由四个组件组成。
例如,假设您选择将两个具有RGBA
分量的归一化颜色矢量放入数据存储中,选择内部格式GL_RGBA
并使用0和1进行索引,则将按部分从缓冲区纹理中获得第一个和第二个纹理像素核心OpenGL 4.4规范 8.9 :
[..]附加的缓冲区对象的数据存储区被解释为GL数据类型的元素数组,对应于internalformat 。 每个纹理像素由1-4个元素组成,这些元素映射到纹理成分(R,G,B和A)。
请注意,根据内部格式, texelFetch
将始终返回gvec4
,即ivec4
, uivec4
或vec4
。 如果选择的内部格式指定的分量少于四个,例如GL_R32F
,结果将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
在构造函数中使用了列,因此,如果使用基于列的矩阵,则需要转置该列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.