gpt4 book ai didi

android - 渲染到纹理 : Maximum number?

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

我在 Android 应用程序中有一个类,它包含一个字节数组作为纹理的数据源。我使用帧缓冲区将一些东西渲染到该纹理上,然后在屏幕上渲染该纹理。这非常有效。

但是,我只能使用 151 个纹理来执行此操作。实例 #152 生成此错误:

:0: PVRSRVAllocDeviceMem: Error 1 returned
:0: ComputeFrameBufferCompleteness: Can't create render surface.

这是代码 fragment (构造函数):

// Texture image bytes
imgBuf=ByteBuffer.allocateDirect(TEXEL_X*TEXEL_Y*3);
imgBuf.position(0);

// Fill the texture with an arbitrary color, so we see something
byte col=(byte)(System.nanoTime()%255);
for (int ii=0; ii<imgBuf.capacity(); ii+=3)
{ imgBuf.put(col);
imgBuf.put((byte)(col*3%255));
imgBuf.put((byte)(col*7%255));
}
imgBuf.rewind();

// Generate the texture
GLES20.glGenTextures(1,textureID,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureID[0]);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_WRAP_S,
GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
GLES20.GL_CLAMP_TO_EDGE);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER,GLES20.GL_LINEAR);

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,GLES20.GL_TEXTURE_MAG_FILTER,
GLES20.GL_LINEAR);

// Associate a two-dimensional texture image with the byte buffer
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D,0,GLES20.GL_RGB,TEXEL_X,
TEXEL_Y,0,GLES20.GL_RGB,GLES20.GL_UNSIGNED_BYTE,imgBuf);

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);

// Get framebuffer for later rendering to this texture
GLES20.glGenFramebuffers(1,frameBufID,0);

这就是问题所在(渲染到纹理)

如果我省略这部分,显示数百个这样的纹理效果很好,但是我无法在纹理上渲染任何东西:(如果我保留它,它可以很好地处理 151 个纹理。

// Bind frame buffer and specify texture as color attachment
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,frameBufID[0]);
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D,textureID[0],0);

// Check status
int status=GLES20.glCheckFramebufferStatus(GLES20.GL_FRAMEBUFFER);
Log.i(TAG,texNum+":"+status);

// Render some stuff on the texture
// ......
// (It does not matter. The status check fails even without rendering anything here)

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,GLES20.GL_COLOR_ATTACHMENT0,GLES20.GL_TEXTURE_2D,0,0);
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER,0);

我希望有人能阐明这一点。谢谢,茹

最佳答案

您很可能正在使用带有 PowerVR SGX540 GPU 的设备,他们在 android 上有这个问题。不在 iOS 上,所以这似乎是一个驱动程序问题,尽管他们的支持在他们的论坛上说:

http://forum.imgtec.com/discussion/3026/glcheckframebufferstatus-returns-gl-framebuffer-unsupported-when-creating-too-many-fbo

如果你真的需要渲染超过 152 个纹理,那么你必须使用 glReadPixels() 读出像素,删除纹理和 fbo,并通过将数据提供给 glTexImage2D 创建一个新纹理

关于android - 渲染到纹理 : Maximum number?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14364429/

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