Я собираюсь сделать графический расчет с помощью OpenCL, например, лучевого каста, лучевого марширования и других. И я хочу использовать OpenGL для отображения результата этих вычислений (пиксельных изображений). Я использую буфер текстуры, прикрепленный к буфере кадров. OpenCL записывает результат в текстуру, а затем я использую функцию glBlitFrameBuffer для копирования данных текстуры в фреймбуфер окна приложения. Я столкнулся с проблемой CL/GL inter во время ее реализации. Я написал простой пример, чтобы показать это. В этом примере показан объект framebuffer и инициализация объекта текстуры, их соединение, создание буфера OpenCL из буфера текстуры GL. В конце показан основной цикл рендеринга. Он состоит из записи текстур с новыми данными в каждом кадре, вложением фреймбуфера и копированием этого фреймбуфера.Совместимость с GL/CL: общая текстура
Texture Initialization:
for (int i = 0; i < data.Length; i +=4) {
data [i] = 255;
}
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte>(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0)
ТВО + FBO Initialization:
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);
CL/GL Initialization:
bufferID = CL.CreateFromGLTexture2D (context, memInfo, textureTarget, mipLevel, glBufferObject, out errorCode);
Рендер Loop:
for (int i = 0; i < data.Length; i += 4) {
data [i] = tt;
}
tt++;
GL.BindTexture (TextureTarget.Texture2D, tboID [0]);
GL.TexImage2D<byte> (TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba8, w, h, 0,
PixelFormat.Rgba, PixelType.UnsignedByte, data);
GL.BindTexture (TextureTarget.Texture2D, 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, fboID [0]);
GL.ReadBuffer (ReadBufferMode.ColorAttachment0);
GL.DrawBuffer (DrawBufferMode.Back);
GL.BlitFramebuffer (0, 0, w, h, 0, 0, w, h, ClearBufferMask.ColorBufferBit, BlitFramebufferFilter.Nearest);
GL.BindFramebuffer (FramebufferTarget.ReadFramebuffer, 0);
На первый взгляд этот код выглядит странно, но он полностью показывает мою проблему. CL вообще не работает. В этом приложении создается контекст OpenCL и выполняется инициализация буфера OpenCL. Работа должна быть простой. Цвет экрана меняется с черного на красный. И это не работает таким образом. Цвет не изменяется от начального красного (инициализация текстуры). Но он работает нормально, когда я комментирую инициализацию CL/GL (создание буфера CL из текстуры GL). Почему это так? Почему поведение буфера GL изменяется в зависимости от вложений CL? Как исправить это и заставить его работать?
Я могу в конце концов подтвердить это поведение, как только объект Image2DGL привязан к текстуре, текстура заблокирована и не может быть записана в другой контекст или из другого контекста. Это также устройство nvidia. Возникает вопрос, почему существует явное 'приобретение' и' релиз', если он заблокирован в любом случае. – rdoubleui