我正在 iOS 上开发 OpenGL ES 2.0,我有这个......
- 带有一些图像(尺寸 1024x768)的纹理 (T1)。
- 屏幕外 FBO (FBO1) 关联纹理 T1,以便我可以将某些内容渲染到 T1 中。
- 另一个相同大小的纹理 (T2)。
- 另一个与 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 纹理。