我如何缓冲模型矩阵数据到纹理使用OpenGL ES2, GLSL, c++
How can I buffer model matrix data into texture using OpenGL ES2, GLSL, C++?
根据这个答案,OpenGL允许你在纹理缓冲中存储任意数据,可以在顶点着色器中访问。
我创建了一个大小为4096 * 256 * 4的Float32Array,其中包含每个模型的世界矩阵(足以用于~256k模型)。每个模型都有一个modelIndex属性,用于从纹理中读取其矩阵。然后在每一帧,gl.texSubImage2D绘制整个纹理,并在每次绘制调用中绘制尽可能多的纹理。
示例场景:
我有一堆独特的模型,他们共享一个共同的着色器,他们的顶点位置打包到一个单独的VBO。我想用从纹理缓冲区中获取的唯一模型矩阵来更新每个模型,然后在单个glDrawElements()
调用中绘制这些模型。
一些非常粗糙的伪代码:
// In C++
struct Vertex {
GLFloat x, y;
GLuint matrixID;
}
// Create an array of floats that represent a unique model matrix
// Assume pre-calculation of values
GLfloat data[32] { /* 32 floats, two 4x4 matrices */ }
glTexImage2D(..., data);
// Then in the vertex shader
attribute vec4 in_Position; // x, y, 1.0, matrixID;
uniform mat4 uf_Projection;
void main() {
// I need help implementing this magical function...
mat4 model = getMatrixFromTextureBuffer(in_Position.w);
// Apply unique model matrix
gl_Position = uf_Projection * model * vec4(in_Position.xy, 1.0, 1.0);
}
// Draw everything!
glDrawElements(...);
有人可以分享一个如何实现这一点的例子吗?我在网上找不到相关信息。
OpenGL允许你在纹理缓冲区中存储任意数据可以在顶点着色器中访问。
在OpenGL ES 2.0的一些实现中是可能的,但在规范中没有要求(最大顶点纹理单位允许为0),因此许多OpenGL ES 2.0的gpu不支持它。
同样,OpenGL ES 2.0不支持浮点纹理(除非作为扩展),所以也不能保证工作。
最后,即使你可以让它工作,从每个顶点的纹理加载16元素的FP32矩阵将是非常慢的,所以只是不要这样做,除非这只是一个桌面GPU的玩具项目…(例如,如果你的目标是使用OpenGL ES 2发布商业移动内容。
相关文章:
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- SFML纹理像播放器
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 着色器纹理值与创建纹理时写入的值不同
- OpenGL将纹理四边形渲染为(0,0)
- 宽度为奇数的16位纹理为片状
- 使用 CUDA 和纹理进行图像减法
- 在不使用统一的情况下将纹理传递给 GLSL 着色器?
- 将使用太多的纹理插值器 - 带旋转的着色器
- dx11 渲染到纹理仅显示透明颜色
- OpenGL 4.3 错误地将第 4 个纹理坐标映射到与第 3 个纹理坐标相同的位置
- 如何使用 DXGI 格式DXGI_FORMAT_R1_UNORM创建 2D 纹理?
- 纹理单位重叠?渲染了错误的纹理
- SFML 纹理变换(放大)
- SDL2 二维纹理分配/池化
- Qt OpenGL 渲染到纹理性能问题
- 为什么我会得到黑色纹理?
- 无法获取要在 OpenGL ES2 中显示的 RGB 纹理
- 我如何缓冲模型矩阵数据到纹理使用OpenGL ES2, GLSL, c++