我已将场景渲染为FBO的纯色并将其存储在纹理2D中,如下所示。
现在我需要访问特定像素坐标或纹理坐标的RGB值,或者有用。
我知道我需要使用GL.ReadPixels
,但只是先成功创建了一个位图,并且每一帧都这样做会造成性能问题。
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, FBO);
GL.Ext.FramebufferTexture2D(FramebufferTarget.FramebufferExt, FramebufferAttachment.ColorAttachment0Ext, TextureTarget.Texture2D, Texture.GetTextureID("FBOtexture"), 0);
Bitmap b = new Bitmap(Width, Height);
var bits = b.LockBits(new Rectangle(0, 0, Width, Height), ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.ReadPixels(0, 0, Width, Height, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bits.Scan0);
GL.Ext.BindFramebuffer(FramebufferTarget.FramebufferExt, 0);
b.UnlockBits(bits);
如何直接访问数据?
答案 0 :(得分:0)
目前,这是有效的
int pixelData = 0;
GL.ReadPixels (fboWidth / 2, fboHeight / 2, 1, 1, OpenTK.Graphics.OpenGL.PixelFormat.Rgb, PixelType.UnsignedByte, ref pixelData);
int red = Color.FromArgb(pixelData).R;
int green = Color.FromArgb(pixelData).G;
int blue = Color.FromArgb(pixelData).B;
但是显着的缺点。
如j-p链接的PBO文章中所述,glReadPixels()
阻塞管道并等待直到所有像素数据都被传输,然后才将控制权返回给应用程序。在我的程序中,在我的机器上,那个档位很明显。
长期解决方案似乎是Pixel Buffer Object,它通过在GL和客户端之间提供异步数据传输来减少开销。当我要展示一些东西时,我会修改这个答案。