Ich beabsichtige, mit OpenCL Grafikberechnungen wie Ray Casting, Ray Marching und andere durchzuführen. Und ich möchte OpenGL verwenden, um das Ergebnis dieser Berechnungen (Pixelbilder) anzuzeigen. Ich verwende einen Texturpuffer, der mit dem Framepuffer verbunden ist. OpenCL schreibt das Ergebnis in die Textur und dann verwende ich die Funktion glBlitFrameBuffer, um die Texturdaten in den Framebuffer des Anwendungsfensters zu kopieren. Bei der Implementierung stieß ich auf ein CL/GL-Interproblem. Ich habe ein einfaches Beispiel geschrieben, um es zu zeigen. Dieses Beispiel zeigt die Initialisierung des Framebuffer-Objekts und des Textur-Objekts, ihre Verbindung und die Erstellung des OpenCL-Puffers aus dem GL-Texturpuffer. Am Ende wird die Haupt-Renderschleife gezeigt. Sie besteht aus dem Schreiben der Textur mit neuen Daten in jedem Frame, dem Anhängen des Framebuffers und dem Kopieren des Framebuffers.
Initialisierung der Textur:
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)
TBO+FBO-Initialisierung:
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, fboID [0]);
GL.FramebufferTexture2D (FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0,
TextureTarget.Texture2D, tboID [0], 0);
GL.BindFramebuffer (FramebufferTarget.FramebufferExt, 0);
CL/GL-Initialisierung:
bufferID = CL.CreateFromGLTexture2D (context, memInfo, textureTarget, mipLevel, glBufferObject, out errorCode);
Rendering-Schleife:
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);
Auf den ersten Blick sieht dieser Code seltsam aus, aber er zeigt mein Problem vollständig. CL funktioniert hier überhaupt nicht. In dieser Anwendung wird ein OpenCL-Kontext erstellt und eine OpenCL-Pufferinitialisierung durchgeführt. Diese Arbeit sollte einfach sein. Die Farbe des Bildschirms wird von schwarz auf rot geändert. Und so funktioniert es nicht. Die Farbe ändert sich nicht vom anfänglichen Rot (Texturinitialisierung). Aber es funktioniert normal, wenn ich die CL/GL-Initialisierung (Erstellung des CL-Puffers aus der GL-Textur) kommentiere. Warum ist das so? Warum ändert sich das Verhalten des GL-Puffers in Abhängigkeit von CL-Anhängen? Wie kann man das Problem beheben, damit es funktioniert?