【问题标题】:OpenGL ES 2D on Samsung 4 - no textures on the screenSamsung 4 上的 OpenGL ES 2D - 屏幕上没有纹理
【发布时间】:2014-05-29 15:16:58
【问题描述】:

我有 Nexus 4 和几个 HTC,我的游戏运行良好。

当我在三星 4 上启动时,我看到白色矩形(空纹理),

没有错误,

此外,我的游戏使用传感器,但我在三星 4 上看到它也不起作用,

但三星 3 - 工作正常,

请帮忙,

[编辑]

在三星 3 上工作!

听说他们对 S4 做了很多改动

[编辑 2]

这是我加载纹理的方式:

public void loadTextures(GL10 gl, Context context){

    //Log.e(LOG_TAG, "DevQuestSprites :: loadTextures");  

    InputStream is;
    Bitmap bitmap;
    is = context.getResources().openRawResource(R.drawable.fly_a1_sprite);


    bitmap = BitmapFactory.decodeStream(is);
    try {
        is.close();
        is = null;
    } catch (IOException e) {
    }

    gl.glGenTextures(textureCount, textures, 0);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

    bitmap.recycle(); 

}

对我来说最无能为力的一行是:

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);

实际上我在这里放置了纹理。

这是draw 方法:

    public void draw(GL10 gl,
        ...
                    ...
        )
{   

     ...

    //gl.glMatrixMode(GL10.GL_MODELVIEW);

    gl.glTranslatef(transx, transy, 0.0f);

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);

    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, floatBufferArray[mFrame]);

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length / 3);
    //gl.glDrawElements(GL10.GL_TRIANGLES, 1, GL10.GL_UNSIGNED_SHORT, vertexBuffer);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
}

[编辑 3]

我添加到drawonDrawFrame 和主循环,没有错误:

int error = gl.glGetError();
    if (error != 0)
        Log.e("main loop", "Draw " + error); 

调试后发现三星4只出现一个新错误:

08-07 12:57:53.356: E/ViewRootImpl(29124): sendUserActionEvent() mView == null

[编辑 4]

@Override
public void onSurfaceCreated(GL10 gl, EGLConfig confid) {
    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);        
    gl.glClearColor(0,0,0,0);
    gl.glClearDepthf(1.0f);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
    gl.glEnable(GL10.GL_BLEND);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
}

【问题讨论】:

  • 您要支持哪个版本的 GL ES?看起来像 1.x,但最好问问。
  • 你的纹理有二维的幂吗?对于 NPOT,您需要明确指定 CLAMP_TO_EDGE 模式。但是因为你得到一个错误,告诉你视图是空的,你应该首先检查你的 OpenGL 上下文初始化代码。
  • 感谢回答,如何查看NPOT Texture?我使用vertices = new float[12]; z=0。顺便说一句,我添加了onSurfaceCreated

标签: android opengl-es opengl-es-1.1


【解决方案1】:

一个问题是您启用了 alpha 混合,但您不能使用 GLUtils.texImage2D() 在 Android 上加载 alpha 纹理。这是一个常见的问题,谷歌确实应该更好地记录。问题是 Bitmap 类将所有图像转换为预乘格式,但这不适用于 OpenGL ES,除非图像完全不透明。最好的解决方案是使用本机代码。本文提供了更多详细信息:

http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1

【讨论】:

  • 如果我不使用glBlendFunc,我的游戏看起来很乱,很多项目开始是静态的,没有动画。它适用于某些设备。
  • 这听起来像是一个 OpenGL ES 驱动程序错误。它在 AVD 中有效吗?如果你真的不需要 alpha 混合,让你的纹理完全不透明,那么使用 GLUtils.texImage2D() 不是问题。此外,您应该使用 GL11 而不是 GL10。 GL10 已过时。
【解决方案2】:

您的图片尺寸是多少?如果您使用的是 opnel GL 这取决于哪个驱动程序拥有移动设备,但您需要图像大小为 2 的幂才能在所有设备(2、4、8、16、32...等)中正常工作

【讨论】:

  • 我需要使用width=height吗?或者 8x16 也应该工作?谢谢
猜你喜欢
  • 2018-08-20
  • 2014-10-23
  • 2011-01-11
  • 2014-05-19
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-01-28
相关资源
最近更新 更多