- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
设置有点复杂,所以我会尽量详细。
首先,我尝试使用 openCL/openGL 互操作。该代码在不使用互操作 cl::ImageGL 时有效,因此基础知识就在那里。该项目使用 3 个主要的 openGL 上下文(花了很多时间才让 openCL 上下文在其中打开)。我在上下文中使用 QGLWidgets。首先创建一个隐藏的 QGLWidget,另外两个共享隐藏的上下文。 2 个 QGLWidgets 中的每一个都在自己的线程中运行。隐藏的 QGLWidget 被转移到创建 openCL 上下文的线程。
QGLFormat qglFormat;
qglFormat.setVersion(3, 3);
qglFormat.setProfile(QGLFormat::CoreProfile);
m_hiddenGl=new GLHiddenWidget(qglFormat);
m_hiddenGl->setVisible(false);
m_view1=new GLWidget(qglFormat, m_hiddenGl);
m_view2=new GLWidget(qglFormat, m_hiddenGl);
...
QThread *processThread=m_process.qThread();
m_hiddenGl->doneCurrent();
m_hiddenGl->context()->moveToThread(processThread);
GLWidget 是一个自定义类,它启动自己的线程并移动上下文,GLHiddenWidget 也是自定义类,但基本上只是重写了防止 makeCurrent 被主线程调用所需的所有函数。
启动时进程线程内部如下
m_hiddenGl->makeCurrent();
hdc=wglGetCurrentDC();
glHandle=wglGetCurrentContext();
cl_context_properties clContextProps[]={
CL_CONTEXT_PLATFORM, (cl_context_properties)m_openCLPlatform(),
CL_WGL_HDC_KHR, (intptr_t) hdc,
CL_GL_CONTEXT_KHR, (intptr_t) glHandle, 0
};
m_openCLContext=cl::Context(m_openCLDevice, clContextProps, NULL, NULL, &error);
一切就绪。从这一点开始,几个内核在传入的图像数据上顺序执行。所有内核都成功(没有错误)但是使用 openGL 纹理写出数据的一个内核无法写入任何内容。使用 openCL cl::Image2d 时,即使将 openCL 上下文创建为互操作,它也能正常工作(产生正确的输出)。
在创建所有 openGL 上下文和创建 openCL 上下文之后(也在与 openCL 上下文相同的线程中)创建 openGL 纹理。在 processThread 的开始,纹理由隐藏的 QGLWidget 和 glGenTextures 生成。然后所有内核与其他 openCL 缓冲区和图像一起创建。在内核执行之前完成以下操作。
if(initBuffer) //runs only if buffer size is changed, allways runs first time
{
m_hiddenGl->makeCurrent();
glBindTexture(GL_TEXTURE_2D, m_texture);
//I have attempted to put data in, result is always black from kernel
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glBindTexture(GL_TEXTURE_2D, 0);
glFinish();
//m_flags is CL_MEM_READ_WRITE
m_imageGL=cl::ImageGL(m_openCLContext, m_flags, GL_TEXTURE_2D, 0, m_texture, &error);
}
和一个简化的内核。
__kernel void kernel1(__read_only image2d_t src1, __read_only image2d_t src2, __write_only image2d_t dst)
{
int2 coord=(int2)(get_global_id(0), get_global_id(1));
uint4 value=255;
write_imageui(dst, coord, convert_uint4(value));
}
即使我不显示纹理图像仍然是黑色的。当使用 cl::Image2d 或 cl::ImageGL 时,图像从 openCL 读回并保存到硬盘。对于 cl::Image2d,它是正确的,对于 cl::ImageGL,它是黑色的。
最佳答案
我遇到了同样的问题并使用 write_imagef()
(不要忘记将 RGBA 值除以 255.0
!),而不是 write_imageui( )
在 OpenCL 内核中解决了它,没有改变 OpenGL 纹理的像素格式(你可能没有机会这样做,特别是如果它是一个现有的纹理,在大型应用程序的其他地方创建)。
关于c++ - 使用 clCreateFromGLTexture 的 opencl/opengl 互操作无法绘制到纹理(纹理黑色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22928704/
设置有点复杂,所以我会尽量详细。 首先,我尝试使用 openCL/openGL 互操作。该代码在不使用互操作 cl::ImageGL 时有效,因此基础知识就在那里。该项目使用 3 个主要的 openG
我是一名优秀的程序员,十分优秀!