OpenGL纹理缓冲区-GLSL语法
OpenGL Texture Buffer - GLSL Syntax
假设我只想渲染四边形并且可以重用我的网格,我希望能够在一个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。偏移总是指纹素,而不是指纹素的单个分量(例如vec4
的R
-分量)。因此,如果使用内部格式GL_R
设置缓冲区纹理,则会查找仅存储单个值的单个texel,但是,如果使用GL_RGBA
,则texel将由四个组件组成。
例如,假设您选择将具有RGBA
组件的两个标准化颜色向量放入数据存储中,选择内部格式GL_RGBA
并使用0和1进行索引,您将根据核心OpenGL 4.4规范的第8.9节从缓冲区纹理中获得第一个和第二个纹素:
[..]附加缓冲区对象的数据存储被解释为与internalformat相对应的GL数据类型的元素数组。每个纹素由一到四个元素组成,这些元素被映射到纹理组件(R、G、B和A)。
请注意,texelFetch
将始终返回gvec4
,即ivec4
、uivec4
或vec4
,具体取决于内部格式。如果选择指定少于四个组件的内部格式,例如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
在构造函数中采用列,因此如果使用基于列的矩阵,则需要对其进行转置。
- 1d 智能指针不适用于语法 (*)++
- 助记符和指向成员语法的指针
- 有人能分解一下这个c++模板的语法吗
- C++避免重复声明的语法是什么
- QMetaObject invokeMethod的基于函数指针的语法
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 单独定义模板化嵌套类方法的正确语法
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 错误 C2760:语法错误:映射迭代器上意外的标记"标识符",预期的";"
- Opengl 3.1 GLSL 140 在 C++ 年输出白色在片段着色器中
- 为什么我会收到错误 C2143 语法错误:缺少"*"之前的';'?
- 奇怪的代码抛出编译错误模板< J,int aSize=10> C2143:语法错误:在"<"之前缺少";"
- 如何在编译器C++不智能的情况下实现 GLSL vec* 构造语法?
- C++ 在 Vulkan 中发送到 GLSL 的可变长度数组的语法
- GLSL语法问题:意外的new_identifier
- GLSL 语法错误:"in"分析错误
- OpenGL纹理缓冲区-GLSL语法
- 顶点着色器中的 GLSL 奇怪'<'语法错误