如何用PyGLM中的数据初始化缓冲区对象的数据存储?

2024-04-26 00:15:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用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数组?在


Tags: numpydatabufferstatic矩阵storage数组缓冲区
1条回答
网友
1楼 · 发布于 2024-04-26 00:15:54

最后我自己找到了解决办法。在

需要注意的是,Shader Storage Buffer由3*4*4=48个紧密堆积的浮点数组成。在

PyGlm提供了方便的函数glm.value_ptr和{}。glm.value_ptr对应于{a3}。glm.sizeof对于glm数据类型,其工作原理与c++^{} operator类似。在

此函数可与^{}包装一起使用,以更新缓冲区数据:

glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0,                      glm.sizeof(glm.mat4), glm.value_ptr(model))
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 1*glm.sizeof(glm.mat4), glm.sizeof(glm.mat4), glm.value_ptr(view))
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 2*glm.sizeof(glm.mat4), glm.sizeof(glm.mat4), glm.value_ptr(proj))

类型为glm.mat4的对象可以分配给形状为(4, 4)、类型为np.float32^{}。因此,这3个矩阵可以分配给形状为numpy.array的元素:

^{pr2}$

此数组可用于一次更新整个缓冲区数据:

buffer_size = buffer_data.size * buffer_data.itemsize
glBufferSubData(GL_SHADER_STORAGE_BUFFER, 0, buffer_size, buffer_data)

或者对于缓冲区对象数据存储的初始^{}创建和初始化:

glBufferData(GL_SHADER_STORAGE_BUFFER, buffer_data, GL_DYNAMIC_DRAW)

相关问题 更多 >

    热门问题