开发界
首页 移动开发 在线交易 IT笔记 网络技术 操作系统 企业架构 数据库 考试认证 IT培训 开源软件 数据存储 行业资讯
大家都在看:java   开发   C#   oracle   mysql   android   web开发   学习   sqlserver   linux   asp   php   ajax   javascript   css   html
OpenCL与OpenGL的共享内存在MFC中实时渲染的问题
2017-02-16 10:02:24 来源:开发界 作者:admin 栏目:操作系统 责任编辑:admin
[导读]通过实时计算纹理中的像素值,然后将纹理绘制到MFC的客户区,进而实时显示渲染的场景。 这里遇到的问题是,离屏渲染单帧画面的时候都是正确的;使用主机内存中的数据对纹理数据进行赋值,也能产生实时渲染的效果;但是,如果使用OpenCL和OpenGL的共享内存,则只能显示第一次的渲染画面,可以确定的是共享内存的内容计算过,但是似乎计算过后的内存数据并没有被赋值到纹理中。
  通过实时计算纹理中的像素值,然后将纹理绘制到MFC的客户区,进而实时显示渲染的场景。
  
  这里遇到的问题是,离屏渲染单帧画面的时候都是正确的;使用主机内存中的数据对纹理数据进行赋值,也能产生实时渲染的效果;但是,如果使用OpenCL和OpenGL的共享内存,则只能显示第一次的渲染画面,可以确定的是共享内存的内容计算过,但是似乎计算过后的内存数据并没有被赋值到纹理中。
  
  下面是相关的代码:
  
  首先是共享内存的定义,没有直接定义为共享纹理:
  
  C/C++ code
  
  ?
  
  1
  
  2
  
  3
  
  4
  
  5
  
  6
  
  glGenBuffers(1, &m_PBO);
  
  glBindBuffer(GL_ARRAY_BUFFER, m_PBO);
  
  glBufferData(GL_ARRAY_BUFFER, ciRenderWinHeight*ciRenderWinWidth*4*sizeof(unsigned char), 0, GL_STREAM_DRAW);
  
  m_PBOMem = clCreateFromGLBuffer(m_Context, CL_MEM_WRITE_ONLY, m_PBO, &iStatus);
  
  下面是对共享内存进行计算的代码
  
  C/C++ code
  
  ?
  
  1
  
  2
  
  3
  
  4
  
  5
  
  6
  
  7
  
  8
  
  9
  
  glFinish();
  
  iStatus = clEnqueueAcquireGLObjects(m_Queue, 1, &m_PBOMem, 0, NULL, NULL);
  
  CheckError(iStatus, _T("获取GL环境下的PBO控制权"));
  
  iStatus = clEnqueueNDRangeKernel(m_Queue, m_RayTraceKernel, 2, NULL, &pixelGlobalGroup[0], &pixelLocalGroup[0], 0, NULL, NULL);
  
  CheckError(iStatus, _T("计算PBO"));
  
  iStatus = clFinish(m_Queue);
  
  iStatus = clEnqueueReleaseGLObjects(m_Queue, 1, &m_PBOMem, 0, NULL, NULL);
  
  CheckError(iStatus, _T("释放CL环境下的PBO控制权"));
  
  iStatus = clFinish(m_Queue);
  
  下面是使用主机内存数据对纹理进行赋值的代码,两个不同的颜色交替赋值,窗口客户区能交替显示两种颜色。
  
  C/C++ code
  
  ?
  
  1
  
  2
  
  3
  
  4
  
  5
  
  6
  
  7
  
  8
  
  9
  
  10
  
  11
  
  12
  
  13
  
  14
  
  15
  
  16
  
  17
  
  18
  
  19
  
  20
  
  21
  
  22
  
  23
  
  24
  
  25
  
  26
  
  27
  
  28
  
  29
  
  std::vector<unsigned char> color(4*ciRenderWinWidth*ciRenderWinHeight);
  
  for (auto itr = color.begin(); itr != color.end();)
  
  {
  
  *itr = 255;
  
  itr++;
  
  *itr = 0;
  
  itr++;
  
  *itr = 0;
  
  itr++;
  
  *itr = 255;
  
  itr++;
  
  }
  
  glBindBuffer(GL_ARRAY_BUFFER, m_PBO);
  
  glBufferData(GL_ARRAY_BUFFER, 4*ciRenderWinHeight*ciRenderWinWidth*sizeof(unsigned char), &color[0], GL_STATIC_DRAW);*/
  
  /*static bool flag = true;
  
  glBindBuffer(GL_ARRAY_BUFFER, m_PBO);
  
  if ( flag )
  
  {
  
  glBufferData(GL_ARRAY_BUFFER, 4*ciRenderWinHeight*ciRenderWinWidth*sizeof(unsigned char), &red[0], GL_STATIC_DRAW);
  
  flag = false;
  
  }
  
  else
  
  {
  
  glBufferData(GL_ARRAY_BUFFER, 4*ciRenderWinHeight*ciRenderWinWidth*sizeof(unsigned char), &green[0], GL_STATIC_DRAW);
  
  flag = true;
  
  }
  
  return TRUE;
版权所有:转载请注明出处!
分享到:
上一篇没有了 下一篇《高效能程序员的修炼》读书笔记..
您可能还喜欢
暂无...
考试认证 更多
开发技术 更多
移动开发 更多

关于开发界 | 合作伙伴 | 联系我们 | 友情链接 | 版权声明 | 网站制作 | 网站地图 | 加入收藏 | 设为首页

Copyright@2012-2016 开发界 京ICP备12027873号