OpenGL glfw 无法绘制点



>我遵循了教程 OpenCL 路径跟踪教程 3:OpenGL 视口、交互式相机和散焦模糊。他使用 GLUT 生成一个窗口,而我尝试将所有过剩的东西切换到 GLFW。但是 glfw 未能在 vbo 中得分,我不知道为什么。窗口可以设置为某种颜色,但不显示任何点。

这是我的 draw(( 函数:

glClearColor(0.0f, 0.0f, 0.5f, 1.0f); // blue
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0f, image_width, 0.0f, image_height);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glVertexPointer(2, GL_FLOAT, 16, 0); // size [2, 3, 4], type, stride, pointer
glColorPointer(4, GL_UNSIGNED_BYTE, 16, (GLvoid*) 8); // size [3, 4], type, stride, pointer
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_POINTS, 0, image_width * image_height);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glfwSwapBuffers(gWindow);

在 GLFW 渲染循环中使用:

cpu_spheres[6].position.s[1] += 0.01;
queue.enqueueWriteBuffer(cl_spheres, CL_TRUE, 0, num_sphere*sizeof(mySphere), cpu_spheres);
// args order in kernel is diff from tutorial
kernel.setArg(4, cl_spheres);
kernel.setArg(5, myHash(num_frame));
runKernel();
draw(); // cannot draw points
glfwSwapBuffers(gWindow);

这是我的OpenGL初始化代码:

if (!glfwInit()) {
std::cerr << "GLFW initialization failed" << std::endl;
return false;
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
gWindow = glfwCreateWindow(image_width, image_height, APP_TITLE, NULL, NULL);
if (gWindow == NULL) {
std::cerr << "Failed to create GLFW window" << std::endl;
glfwTerminate();
return false;
}
glfwMakeContextCurrent(gWindow);
glewExperimental = GL_TRUE;
if (glewInit() != GLEW_OK) {
std::cerr << "Failed to initialize GLEW" << std::endl;
return false;
}
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glMatrixMode(GL_PROJECTION);
gluOrtho2D(0.0f, image_width, 0.0f, image_height);

runKernel 与教程中的相同:

std::size_t global_work_size = image_width * image_height;
std::size_t local_work_size  = kernel.getWorkGroupInfo<CL_KERNEL_WORK_GROUP_SIZE>(device);
if (global_work_size % local_work_size != 0)
global_work_size = (global_work_size / local_work_size + 1) * local_work_size;
// Make sure OpenGL is done using VBOs
glFinish();
queue.enqueueAcquireGLObjects(&cl_vbos);
queue.finish();
// Launch the kernel
queue.enqueueNDRangeKernel(kernel, cl::NullRange, global_work_size, local_work_size);
queue.finish();
// Release VBOs so OpenGL can use them
queue.enqueueReleaseGLObjects(&cl_vbos);
queue.finish();

你的代码的一个问题是你告诉GLFW创建OpenGL 3.3 Core配置文件。核心配置文件上下文不支持旧版 API,例如客户端顶点数组(glVertexPointerglEnableClientState等(。假设没有其他问题,您应该能够通过将其GLFW_OPENGL_CORE_PROFILE更改为GLFW_OPENGL_COMPAT_PROFILE,或者删除对glfwWindowHint的所有调用。

最新更新