3

我正在 iOS 上开发 OpenGL ES 2.0,我有这个......

  1. 带有一些图像(尺寸 1024x768)的纹理 (T1)。
  2. 屏幕外 FBO (FBO1) 关联纹理 T1,以便我可以将某些内容渲染到 T1 中。
  3. 另一个相同大小的纹理 (T2)。
  4. 另一个与 T2 相关的 FBO (FBO2)。(我将用它渲染到纹理 T2)。

现在在一个循环中,我将 T1 的内容渲染到 FBO2(因此 T1 被传输到 T2),然后将 T2 渲染到 FBO1(T2 被传输回 T1)。

经过几次迭代(仅 7-8 次),加载到 T1 的原始图像会严重失真/模糊(好像它做了水平模糊)。

但是,如果我对方形图像做同样的事情(不必是 2 的幂),图像仍然清晰。

这是我用来创建纹理的代码..

GLuint texture = 0;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

这是我用来创建 FBO 的代码...

 glGenFramebuffers(1, &targetFBO);
 glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
 glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);

我的着色器是最基本的,只是将纹理渲染成 gl_FragColor。

这是我的渲染 Objective-C 代码...

- (void) draw {
    GLfloat textureCoordinates[] = {
        0.0f, 0.0f,
        1.0f, 0.0f,
        0.0f,  1.0f,
        1.0f,  1.0f,
    };

    GLfloat imageVertices[] = {
        -1.0f, -1.0f,
        1.0f, -1.0f,
        -1.0f,  1.0f,
        1.0f,  1.0f,
    };

    glViewport(0, 0, targetWidth, targetHeight);
    glBindFramebuffer(GL_FRAMEBUFFER, targetFBO);
    glUseProgram(program);
    glActiveTexture(GL_TEXTURE2);
    glBindTexture(GL_TEXTURE_2D, textureID);
    glUniform1i(inputTextureLocation, 2);
    glDisable(GL_BLEND);

    glVertexAttribPointer(positionLocation, 2, GL_FLOAT, 0, 0, imageVertices);
    glVertexAttribPointer(inputTextureCoordinateLocation, 2, GL_FLOAT, 0, 0, textureCoordinates);
    // Clear the screen
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glClear(GL_COLOR_BUFFER_BIT);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);   
}

还有我的顶点着色器...

 attribute vec4 position;
 attribute vec4 inputTextureCoordinate;

 varying vec2 textureCoordinate;

 void main()
 {
     gl_Position = position;
     textureCoordinate = inputTextureCoordinate.xy;
 }

片段着色器...

 varying highp vec2 textureCoordinate;

 uniform sampler2D inputTexture;

 void main()
 {
     gl_FragColor = texture2D(inputTexture, textureCoordinate);
 }

原图...原始图像

扭曲的图像...扭曲的图像

如何避免在非方形纹理上模糊?

编辑:问题实际上出在 No-Power-of-Two 纹理上。不仅仅是非方形。我无法找到解决方案,所以我将使用 POT 纹理。

4

0 回答 0