我使用PyGLM和{a2}
我在Vertex Shader中指定了以下Shader Storage Buffer:
layout(std430, binding = 1) buffer MVP
{
mat4 u_proj;
mat4 u_view;
mat4 u_model;
} mvp_data;
我已经初始化了模型、视图和投影矩阵:
^{2}$如何使用^{glNamedBufferData
)创建和初始化缓冲区对象的数据存储
ssbo = glGenBuffers( 1 )
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo )
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*16*4, ???, GL_STATIC_DRAW )
分别由^{glNamedBufferSubData
)初始化
ssbo = glGenBuffers( 1 )
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo )
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*16*4, None, GL_STATIC_DRAW )
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, ???, ???);
由于SSBO包含3个(紧压缩)mat4
,所以缓冲区的大小是3*16*4(元素数据类型为float
的3x4矩阵)。
所以缓冲区的初始化可以通过NumPy数组来完成。
但是如何将PyGLM矩阵有效地分配给NumPy数组呢?在
buffer_data = numpy.zeros(3*16, dtype=numpy.float32)
??? buffer_data = model, view, proj
glBufferData(GL_SHADER_STORAGE_BUFFER, buffer_data.nbytes, buffer_data, GL_STATIC_DRAW)
或者有没有更有效的解决方案,不需要将数据复制到NumPy数组?在
最后我自己找到了解决办法。在
需要注意的是,Shader Storage Buffer由3*4*4=48个紧密堆积的浮点数组成。在
PyGlm提供了方便的函数}。} operator 类似。在
glm.value_ptr
和{glm.value_ptr
对应于{a3}。glm.sizeof
对于glm数据类型,其工作原理与c++^{此函数可与^{} 包装一起使用,以更新缓冲区数据:
类型为} 。因此,这3个矩阵可以分配给形状为
^{pr2}$glm.mat4
的对象可以分配给形状为(4, 4)
、类型为np.float32
的^{numpy.array
的元素:此数组可用于一次更新整个缓冲区数据:
或者对于缓冲区对象数据存储的初始^{} 创建和初始化:
相关问题 更多 >
编程相关推荐