Я использую PyGLM и PyOpenGL
Я указал следующий буфер хранения шейдера в вершинном шейдере :
layout(std430, binding = 1) buffer MVP
{
mat4 u_proj;
mat4 u_view;
mat4 u_model;
} mvp_data;
Я инициализировал модель, вид и матрицу проекции:
model = glm.mat4(1)
view = glm.lookAt(glm.vec3(0,-3,0), glm.vec3(0,0,0), glm.vec3(0,0,1))
proj = glm.perspective(glm.radians(90), self.__vp_size[0]/self.__vp_size[1], 0.1, 100)
Как создать и инициализировать хранилище данных буферного объекта с помощью glBufferData
(или glNamedBufferData
)
ssbo = glGenBuffers( 1 )
glBindBuffer(GL_SHADER_STORAGE_BUFFER, ssbo )
glBufferData(GL_SHADER_STORAGE_BUFFER, 3*16*4, ???, GL_STATIC_DRAW )
соответственно инициализируется glBufferSubData
(или 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 (3 4x4-матрицы с типом данных элемента float
).
Таким образом, инициализация буфера может быть выполнена с помощью массива 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?