2012-03-05 106 views
1

这是我的第一个问题。 我是新开发的Android开发人员,现在我开发了一个动态壁纸(LiveSpace) 我已经上传了精简版,你可以在这里找到它。 https://market.android.com/details?id=thedavincode.alienland&feature=search_result#?t=W251bGwsMSwyLDEsInRoZWRhdmluY29kZS5hbGllbmxhbmQiXQ ..Samsung Galaxy S2 OpenGl ES 2.0问题

我用Xperia手机和Lg P990测试了它,它似乎工作正常,但Galaxy S2有一个奇怪的问题。 (2.3.4。android) 我的应用程序有11个对象(类),每个对象都有纹理,每个对象都有自己的程序和着色器。星系不会呈现超过8个纹理。它从ID 0到7,然后休息对象apear黑色。不管我什么都没有尝试过任何改变。 我读过,有8个纹理的限制,但是每个着色器不是总数。 任何帮助将是有价值的..谢谢。

回答

1

SGS2(Mali400MP)具有最大值的限制。 8个纹理单元。如果您在着色器中仅使用单一纹理,则只能使用一个单元。例如:

  1. 当你正在做一些设置与着色器,那么你的质地均匀绑定到第一个纹理单元(0),如:glUniform1i(uTexture, 0); - 这样做对所有对象
  2. 渲染每个对象绑定纹理之前它属于它:glBindTexture(GL_TEXTURE_2D , m_texture); - 您将纹理绑定到活动纹理单元。
  3. 由于在这种情况下,只使用一个纹理单元,可以省略glActiveTexture通话,因为默认情况下第一纹理单元激活(GL_TEXTURE0

你应该始终保持在规格限制,如果可能的话,要兼容与大多数设备。

每个物体/纹理使用一个纹理单元不是一种方法。

+0

感谢您的回复kibab。以及我想我做所有这些看到我的代码。 – DavinCode 2012-03-05 18:54:02

+0

感谢您的回复kibab。以及我想我做所有这些看到我的代码。 这是每个对象类的绘图 \t GLES20.glUseProgram(GroundProgram); // checkGlError(“glUseProgram”); int grtextureLoc = GLES20.glGetUniformLocation(GroundProgram,“sTexture”); GrTextureID = Commons.Mytextures [11]; \t GLES20.glActiveTexture(GLES20.GL_TEXTURE11); \t GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,GrTextureID); 并设置我的着色器和其他东西后,并绘制 GLES20.glUniform1i(grtextureLoc,GrTextureID); 我想念什么? – DavinCode 2012-03-05 19:03:19

+0

您不会将纹理ID传递给制服。你传递纹理单元索引。在这里阅读:http://www.opengl.org/wiki/GLSL_Sampler#Binding_textures_to_samplers你真的需要在着色器中同时读取12个纹理吗? – 2012-03-05 19:45:35