首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL ES FBO缩放

OpenGL ES FBO缩放
EN

Stack Overflow用户
提问于 2016-06-28 08:54:42
回答 1查看 489关注 0票数 1

这个问题是原来的问题的后续问题,由马季奇·奥布拉克推荐。

一旦FBO被设置并呈现到,如何将呈现的图像返回到默认的呈现缓冲区并在缩放版本中显示。

代码语言:javascript
复制
-(void)setupFBO {
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_2D, tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 256, 256, 0, GL_BGRA, GL_UNSIGNED_BYTE, NULL);

glGenFramebuffers(1, &fbo);
glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0);
}

首先呈现给FBO:

代码语言:javascript
复制
-(void)glkView:(GLKView *)view drawInRect:(CGRect)rect{

glBindFramebuffer(GL_FRAMEBUFFER, fbo);
glViewport (0, 0, 160, 144);
glClearColor (1.0f, 0.0f, 0.0f, 0.5f);
glClear (GL_COLOR_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);
glViewport(0, 0, 160, 144);

glBindVertexArrayOES(_vertexArray);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

如果我取消对fbo绑定的评论,就会正确地显示这个方块--所以我不认为这是VBO和VAO的问题。

尝试将结果显示回放大以适合屏幕的主视图:

代码语言:javascript
复制
[((GLKView *) self.view) bindDrawable];
glViewport (0, 0, view.frame.size.width, view.frame.size.height);
glClearColor (0.0f, 1.0f, 0.0f, 0.5f);
glClear (GL_COLOR_BUFFER_BIT);

//vb2 has the scaled vertex coordinates
glBindBuffer(GL_ARRAY_BUFFER, vb2);
glEnableVertexAttribArray(GLKVertexAttribPosition);
glVertexAttribPointer(GLKVertexAttribPosition, 2, GL_FLOAT, GL_FALSE, 0, 0);

//make sure we are not redrawing the same thing? the texture should be
//a colored cube based on what the fbo rendered.
glDisableVertexAttribArray(GLKVertexAttribColor);

//create a buffer for the texture coordinates
//should be moved in setup phase, but left in for testing
glGenBuffers(1, &texBuffer);
glBindBuffer(GL_ARRAY_BUFFER, texBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*8, squareTex, GL_STATIC_DRAW);
glEnableVertexAttribArray(GLKVertexAttribTexCoord0);
glVertexAttribPointer(GLKVertexAttribTexCoord0, 2, GL_FLOAT, GL_FALSE, 0, 0);
//bind to the fbo texture
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

我读过和遵循的一些教程。

  1. OpenGL FBO实例
  2. 松和OGL FBO
  3. RTT

最终,我想要一个模拟的GB屏幕(160x144像素)显示在模拟器的全部宽度(保持高度比)。

我从一个小正方形开始,并试图扩展它,以实现复古平方像素效果。

EN

回答 1

Stack Overflow用户

发布于 2016-06-28 10:11:20

为了达到拉伸效果,您所需要做的就是画一个带有纹理的全屏幕矩形。如果没有使用矩阵,则只需将顶点位置数据设置在范围-1,1,因此对于三角形条:

代码语言:javascript
复制
{-1, -1,
  1, -1,
 -1,  1,
  1,  1}

纹理坐标应取决于原始纹理视口比与纹理大小的比例。对于您的160x144示例,最近的足够大的纹理大小数据将是256x256,这将导致ratio = (160/256, 144/256),因此坐标如下

代码语言:javascript
复制
{.0,       .0,
ratio.x,   .0,
.0,        ratio.y,
ratio.x,   ratio.y}

如果这没有显示结果,则需要在任何时候找到可能出现的问题。首先,我将尝试用纯色绘制这个坐标,看看矩形是否是全屏绘制的。如果是,那么问题最有可能是从FBO收到的纹理。如果我假设您正在使用Xcode,最好的工具是创建一个框架快照(一个位于左下角的工具),它将显示框架中任意一点的所有调用和所有纹理。使用它,您可能会看到纹理是否正确地绘制到。

不要忘记检查openGL错误(glGetError),并在附件glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE之后检查FBO缓冲区的状态。

这是我的一个项目的方法,它创建了一个FBO。这可能对你有帮助。

代码语言:javascript
复制
    glGenFramebuffers(1, &_frameBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, _frameBuffer);

    glGenRenderbuffers(1, &_renderBuffer);
    glBindRenderbuffer(GL_RENDERBUFFER, _renderBuffer);

    glRenderbufferStorage(GL_RENDERBUFFER, GL_RGBA8_OES, texture.textureWidth, texture.textureHeight);
    glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _renderBuffer);

    [texture bind];
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture.textureID, 0);

    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_bufferWidth);
    glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_bufferHeight);

    [GLGlobalTools checkFramebufferStatus];
    [GLGlobalTools checkError];

    _bufferWidthf = _bufferWidth;
    _bufferHeightf = _bufferHeight;

    _surfaceWidth = (GLint)texture.imageWidth;
    _surfaceHeight = (GLint)texture.imageHeight;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38071480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档