【问题标题】:Renderbuffers larger than window size - OpenGL渲染缓冲区大于窗口大小 - OpenGL
【发布时间】:2013-05-25 11:20:33
【问题描述】:

我正在尝试绘制到大于屏幕尺寸(即 320x480)的渲染缓冲区 (512x512)。

执行 glReadPixels 后,图像看起来是正确的,除非图像的尺寸超过屏幕尺寸 - 在本例中,超过 320 水平和 480 垂直。是什么导致了这种异常?有什么我想念的吗? 当窗口大小 >= 渲染缓冲区的大小时,此代码绝对可以正常工作。

渲染到缓冲区和 glReadPixel'd 的示例图像: http://img593.imageshack.us/img593/3220/rendertobroke.png

unsigned int canvasFrameBuffer;
bglGenFramebuffers(1, &canvasFrameBuffer);
bglBindFramebuffer(BGL_RENDERBUFFER, canvasFrameBuffer);

// Attach renderbuffer
unsigned int canvasRenderBuffer;
bglGenRenderbuffers(1, &canvasRenderBuffer);
bglBindRenderbuffer(BGL_RENDERBUFFER, canvasRenderBuffer);
bglRenderbufferStorage(BGL_RENDERBUFFER, BGL_RGBA4, width, height);
bglFramebufferRenderbuffer(BGL_FRAMEBUFFER, BGL_COLOR_ATTACHMENT0, BGL_RENDERBUFFER, canvasRenderBuffer);

bglViewport(0, 0, width, height);

Matrix::matrix_t identity, colorMatrix;
Matrix::LoadIdentity(&identity);
Matrix::LoadIdentity(&colorMatrix);
bglClearColor(1.0f, 1.0f, 1.0f, 1.0f);
bglClear(BGL_COLOR_BUFFER_BIT);

Vector::vector_t oldPos, oldScale;
Vector::Copy(&oldPos, &pos);
Vector::Mul(&pos, 0.0f);
Vector::Copy(&oldScale, &scale);
Vector::Load(&scale, 1, 1, 1);
int oldHAlign = halignment;
int oldVAlign = valignment;
halignment = Font::HALIGN_LEFT;
valignment = Font::VALIGN_BOTTOM;
float oldXRatio = vid.xratio;
float oldYRatio = vid.yratio;
vid.xratio = 1;
vid.yratio = 1;
Drawing::Set2D(this->size.x, this->size.y); // glOrtho and setup projection/modelview matrices
Draw(&identity, &colorMatrix);
Vector::Copy(&pos, &oldPos);
Vector::Copy(&scale, &oldScale);
halignment = oldHAlign;
valignment = oldVAlign;
vid.xratio = oldXRatio;
vid.yratio = oldYRatio;

byte *buffer = (byte*)Z_Malloc(width * height * 3, ZT_STATIC);
bglPixelStorei(BGL_PACK_ALIGNMENT, 1);
bglReadPixels(0, 0, width, height, BGL_RGB, BGL_UNSIGNED_BYTE, buffer);

byte *final = RGBtoLuminance(buffer, width, height);

SaveTGA("canvas.tga", final, width, height, 1);

Z_Free(buffer);

// unbind frame buffer
bglBindRenderbuffer(BGL_RENDERBUFFER, 0);
bglBindFramebuffer(BGL_FRAMEBUFFER, 0);
bglDeleteRenderbuffers(1, &canvasRenderBuffer);
bglDeleteFramebuffers(1, &canvasFrameBuffer);

bglViewport(0, 0, vid.width, vid.height);

【问题讨论】:

  • 有一个剪切矩形,默认为窗口大小。可能有办法改变它。
  • 这都是什么 BGL 废话?另外,这是关于 OpenGL 还是 OpenGL ES?
  • bgl 只是一个包装器,有助于避免不同类型驱动程序的 EXT/ARB 问题。这既是桌面 GL 也是 GLES,但使用的是 GLES 子集。我认为它也可能会剪裁,但我正确设置了 glOrtho。原来我在 glBindFramebuffer 上使用 GL_RENDERBUFFER 而不是 GL_FRAMEBUFFER。多么简单。 :P

标签: opengl opengl-es fbo


【解决方案1】:

这就是答案。

改变这一行: bglBindFramebuffer(BGL_RENDERBUFFER, canvasFrameBuffer);

对此: bglBindFramebuffer(BGL_FRAMEBUFFER, canvasFrameBuffer);

【讨论】:

    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多