窗口大小之外的渲染缓冲区 - OpenGL

3
我试图在一个比屏幕尺寸(即320x480)大的渲染缓冲区(512x512)上绘制图像。在进行glReadPixels之后,图像看起来正确,但一旦图像的大小超过了屏幕尺寸,例如超过320个水平方向和480个垂直方向,就会出现异常。是什么原因导致了这种情况?我是否遗漏了什么?当窗口大小 >= 渲染缓冲区大小时,此代码运行得非常好。下面是示例图像(已渲染到缓冲区并使用glReadPixel读取):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);

有一个默认大小为窗口大小的剪辑矩形。可能有一种方法可以更改它。 - Ben Voigt
请查看此处的项目10.040:http://www.opengl.org/archives/resources/faq/technical/clipping.htm - Ben Voigt
这些BGL废话是什么意思?另外,这是关于OpenGL还是OpenGL ES? - Nicol Bolas
bgl只是一个包装器,帮助避免不同类型驱动程序的EXT/ARB问题。这既适用于桌面GL又适用于GLES,但使用的是GLES子集。我以为可能是剪裁的问题,但我已经正确设置了glOrtho。结果发现我在glBindFramebuffer上使用了GL_RENDERBUFFER而不是GL_FRAMEBUFFER。多么简单啊。:P - user1054922
1个回答

1

这里是答案。

将这一行代码更改为: bglBindFramebuffer(BGL_FRAMEBUFFER, canvasFrameBuffer);


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接