GLSL uchar输入与OpenCL共享

时间:2014-09-13 19:13:09

标签: opengl glsl opencl shader

代码架构

我想想象一些通过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收到的数据是最新的。所以我的期望是我在那里做错了。

看起来共享本身也是正确的,因为我没有位置数据的问题。

有任何建议如何解决这个问题?

0 个答案:

没有答案