gpt4 book ai didi

android - 在 Android 上使用大于 256x256 的 FBO 会导致视觉失真

转载 作者:行者123 更新时间:2023-11-29 00:43:22 25 4
gpt4 key购买 nike

我正在尝试将一个 iPhone 应用程序移植到 Android,但我无法让我的帧缓冲区代码正常工作。我发现每当我在 Android 上使用 512x512 或 1024x1024 FBO 时,缓冲区都会损坏,导致绘制大量伪影。 256x256 FBO 运行良好。

我构建了一个重现该问题的小项目。您可以通过 this link 下载整个 repro 项目。 , 但我也把重要的部分粘贴在这里:

class GLRenderer implements GLSurfaceView.Renderer {

int TextureID;
int FrameBufferID;

public void onSurfaceCreated(GL10 gl, EGLConfig config) {

//Create texture
int[] buf = new int[1];
gl.glGenTextures(1, buf, 0);
TextureID = buf[0];

gl.glBindTexture(GL11.GL_TEXTURE_2D, TextureID);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);

//Render our jpeg into the texture as the background
GLUtils.texImage2D(GL11.GL_TEXTURE_2D, 0, FBOTestActivity.BackgroundBitmap, 0);

GL11ExtensionPack gl11ep = (GL11ExtensionPack) gl;

//Create a framebuffer
gl11ep.glGenFramebuffersOES(1, buf, 0);
FrameBufferID = buf[0];

gl11ep.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, FrameBufferID);
gl11ep.glFramebufferTexture2DOES(GLES11Ext.GL_FRAMEBUFFER_OES, GLES11Ext.GL_COLOR_ATTACHMENT0_OES, GL11.GL_TEXTURE_2D, TextureID, 0);

//Render a rectangle into the framebuffer
gl.glMatrixMode(GL11.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0, FBOTestActivity.Size, 0, FBOTestActivity.Size, -1, 1);
gl.glMatrixMode(GL11.GL_MODELVIEW);
gl.glViewport(0,0, FBOTestActivity.Size, FBOTestActivity.Size);

gl.glVertexPointer(2, GL11.GL_FLOAT, 0, MakeBuffer(new float[] { 64, 64, 192, 64, 64, 192, 192,192 }));
gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
gl.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);

//Unbind
gl11ep.glBindFramebufferOES(GLES11Ext.GL_FRAMEBUFFER_OES, 0);
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
gl.glViewport(0, 0, w, h);
}

private FloatBuffer MakeBuffer(float[] arr)
{
ByteBuffer vbb = ByteBuffer.allocateDirect(2 * 4 * 8);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer fb = vbb.asFloatBuffer();
fb.put(arr);
fb.position(0);
return fb;
}

public void onDrawFrame(GL10 gl) {
gl.glMatrixMode(GL11.GL_PROJECTION);
gl.glLoadIdentity();
gl.glOrthof(0f, 1.0f, 1f, 0f, -1.0f, 1.0f);
gl.glMatrixMode(GL11.GL_MODELVIEW);

gl.glClearColor(255, 0,0, 255);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

//Just render the texture. It should show our background with a white rectangle in front.
gl.glEnableClientState(GL11.GL_VERTEX_ARRAY);
gl.glEnableClientState(GL11.GL_TEXTURE_COORD_ARRAY);

gl.glEnable(GL11.GL_TEXTURE_2D);
gl.glBindTexture(GL11.GL_TEXTURE_2D, TextureID);
gl.glVertexPointer(2, GL11.GL_FLOAT, 0, MakeBuffer(new float[] { 0, 0, 0, 1, 1, 0, 1, 1 }));
gl.glTexCoordPointer(2, GL11.GL_FLOAT, 0, MakeBuffer(new float[] {0, 0, 0, 1, 1, 0, 1, 1}));
gl.glDrawArrays(GL11.GL_TRIANGLE_STRIP, 0, 4);

}
}

如果我在 256x256 纹理上运行它,一切都很好,我看到了这个:

如果我使用 512x512 纹理(或 1024x1024)运行它,我会看到:

OpenGL 没有返回任何错误,这段代码在 iPhone 上运行正常。我试过 Android 2.1、2.2 和 2.3,但它们的行为都一样。我正在运行 2.3.6 的 Nexus One 上进行测试。

在没有 FBO 的情况下单独渲染 512x512 纹理效果很好,所以问题与 FBO 有关。我已经坚持了一段时间 - 如果有任何帮助,我将不胜感激!

最佳答案

这确实是一种奇怪的行为。如果我在 onSurfaceCreated 的开头添加对 glClear 的调用,我可以在我的 HTC Desire 上获得正确的渲染。更奇怪的是,如果只清除颜色或深度缓冲区似乎并不重要,它甚至在传递 0 作为位掩码时也有效。我猜这只是隐藏了仍然未知的真正原因。

关于android - 在 Android 上使用大于 256x256 的 FBO 会导致视觉失真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8043069/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com