gpt4 book ai didi

opengl - 使用像素缓冲区对象 (PBO) 从帧缓冲区对象 (FBO) 读取像素值

转载 作者:行者123 更新时间:2023-12-02 07:15:16 28 4
gpt4 key购买 nike

我可以使用像素缓冲区对象 (PBO) 直接从 FBO 读取像素值(即使用 glReadPixels)(即在 FBO 仍处于连接状态时)吗?

如果是,

  1. 将 PBO 与 FBO 结合使用有哪些优点和缺点?
  2. 以下代码有什么问题

{

//DATA_SIZE = WIDTH * HEIGHT * 3 (BECAUSE I AM USING 3 CHANNELS ONLY)
// FBO and PBO status is good
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboId);
//Draw the objects

以下 glReadPixels 工作正常

glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE,  (uchar*)cvimg->imageData);

以下 glReadPixels 不起作用:(

glBindBufferARB(GL_PIXEL_PACK_BUFFER_ARB, pboId);
//yes glWriteBuffer has also same target and I also checked with every possible values
glReadBuffer(GL_COLOR_ATTACHMENT0_EXT);
glReadPixels(0, 0, screenWidth, screenHeight, GL_BGR_EXT, GL_UNSIGNED_BYTE, (uchar*)cvimg->imageData);
.
.
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0); //back to window framebuffer

最佳答案

当使用 PBO 作为 glReadPixels 的目标时,您必须指定缓冲区中的字节偏移量(我想是 0)而不是 (uchar*) cvimg->imageData 作为目标地址。它类似于使用 VBO 时在 glVertexPointer 中使用缓冲区偏移量。

编辑:当 PBO 绑定(bind)到 GL_PIXEL_PACK_BUFFER 时,glReadPixels 的最后一个参数不会被视为指向系统内存的指针,而是被视为指向系统内存的指针。作为绑定(bind)缓冲区内存中的字节偏移量。因此,要将像素写入缓冲区,只需传递 0(将它们写入缓冲区内存的开头)。然后您可以稍后通过 glMapBuffer 访问缓冲区内存(以获取像素)。您在评论中提供的示例链接也可以做到这一点,只需广泛阅读即可。我还建议阅读他们在开始时提到的有关顶点缓冲区对象的部分,因为这些为理解缓冲区对象奠定了基础。

关于opengl - 使用像素缓冲区对象 (PBO) 从帧缓冲区对象 (FBO) 读取像素值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6144268/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com