代码架构
我想想象一些通过OpenCL更新的粒子。粒子具有位置和类型属性。该位置存储为三个浮点数,而类型是unsigned char。在可视化中,位置正确更新,但如果我尝试包含该类型,则不再可以从OpenGL端看到缓冲区更新(稍后会详细介绍)。
这些类型用作着色器的输入数据(我正在使用OGLplus):
buffers.particle_types.Bind(gl::Buffer::Target::Array);
(*program | "particle_type")
.Setup<GLubyte>(1)
.Enable()
.Divisor(1);
.Setup
基本上扩展为
VertexAttribIPointer(loc, 1, GL_UNSIGNED_BYTE, 0, 0)
在顶点着色器中,输入定义为...
in int particle_type;
我不确定这是否正确 - 从主机端数据类型设置为GL_UNSIGNED_BYTE
- 我的期望是转换是在运行中完成的吗?像in uchar particle_type
之类的东西不起作用。
更新代码看起来基本上就是那个
std::vector<cl::Memory> gl_buffers{
particle_types,
particle_positions
};
glFinish();
cl_queue.enqueueAcquireGLObjects(&gl_buffers);
simulation.update(); // reads from / writes into buffers
cl_queue.enqueueReleaseGLObjects(&gl_buffers);
cl_queue.finish();
问题描述
当可视化处于活动状态时,似乎对类型缓冲区的更新在OpenGL端不可见。这意味着可视化是错误的。我也尝试通过glGetBufferSubData
将opengl-buffer读入主机内存,但也没有更新。有趣的是,如果禁用可视化,则从glGetBufferSubData
收到的数据是最新的。所以我的期望是我在那里做错了。
看起来共享本身也是正确的,因为我没有位置数据的问题。
有任何建议如何解决这个问题?