【问题标题】:OpenGL es glDrawTexfOES() 2D texture not renderingOpenGL es glDrawTexfOES() 2D 纹理不渲染
【发布时间】:2012-03-08 20:17:15
【问题描述】:

首先我知道这是一个重复的问题,我检查了其他问题但没有帮助!我正在尝试将我的 android 游戏从画布系统转换为 GL10。经过大量的谷歌搜索后,我决定为表演者这样做。无论如何,我尝试构建一个加载和绘制纹理的类。问题是纹理在我的蓝屏上显示为全黑。 我不确定我是否可以在不创建任何网格或类似的东西的情况下绘制纹理,但这就是我想要做的。我只是想以自己的尺寸绘制 2D 纹理,所以我认为不需要网格。这是我的代码:

onSurfaceCreated

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        gl.glClearColor(0.0f, 0.0f, 1.0f, 0.2f);
        gl.glClearDepthf(1.0f);
        gl.glViewport(0, 0, 800,  480);

        gl.glShadeModel(GL10.GL_SMOOTH);
        gl.glEnable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glDepthFunc(GL10.GL_LEQUAL);
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
        gl.glLoadIdentity();
        // This is the class where I load and draw my textures.
        textureStorage = new TextureStorage(gl);
        //I'm loading a texture.      **CODE A TEXTURE LOADER**
        bgNightID  = textureStorage.Load(BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_game));
        //This is where I load my units variables. Nothing to do with it.
        RenderingFunctions.InitUnits(this);
    }

onDrawFrame

@Override
public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glLoadIdentity();
    //gl.glTranslatef(0, 0, -4);
        **CODE B DRAWING**
        // bgNightID is the ID of texture was loaded.
        textureStorage.DrawTexture(bgNightID, 50,50,0,(short)4000,(short)638);
        // Drawing background right here which is shows up black. 
}

编写纹理加载器

public int glLoad( Bitmap bitmap ){
    if ( gl == null ){
        Log.e(TAG, "Failed to load resource.  Context/GL is NULL");return -1;
    }
    int textureName = -1;
    gl.glGenTextures(1, TexIDStorage, 0);
    textureName = TexIDStorage[0];

    Log.d(TAG, "Generated texture: " + textureName);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureName);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    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_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);

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

    int error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR){ 
        Log.e(TAG, "GL Texture Load Error: " + error);
    }else
        Log.d(TAG, "Loaded texture: " + textureName);
    return textureName;
}

代码 B 绘图

public void DrawTexture(int TexutreID, float X, float Y, float Z, short Width, short Height){
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    //gl.glColor4f(1.0f, 1.0f, 1.0f, 0.5f);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, TexIDStorage[TexutreID]);
    ((GL11Ext) gl).glDrawTexfOES(X, Y, Z, Width, Height);
}

我对 GL10 完全陌生,无法弄清楚问题所在以及我缺少什么。因此,如果有人可以帮助我,那就太好了。谢谢你给我时间!

【问题讨论】:

    标签: java android opengl-es


    【解决方案1】:

    我很确定纹理的宽度和高度必须是 2 的幂才能显示属性。尝试缩放您的位图,使其成为 2 的幂。

    【讨论】:

    • 好吧,经过大量的努力,我发现你是对的。我没有给这个 2 问题的机会,正因为如此,我失去了 1 天的生命。现在它完美运行。
    【解决方案2】:

    好吧,我也不是主要的 OpenGL 专家,但从我在您的代码中看到的唯一有点奇怪的是您如何加载图像,即这部分:

    bgNightID  = textureStorage.Load(BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_game));
    

    我所做的只是像这样创建一个 Bitmap 实例:

    InputStream is = appContext.getResources().openRawResource(R.drawable.whateverId);
    Bitmap bitmap =  = BitmapFactory.decodeStream(is);
    

    然后将其传递给 GLUtils:

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

    我也从不打电话给 glTexEnv:

    //I don't do this:
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
    

    【讨论】:

    • bgNightID = textureStorage.Load(BitmapFactory.decodeResource(context.getResources(),R.drawable.bg_game));在这里,我将位图发送到加载器函数,它与你做同样的事情(我也共享该函数 CODE A)但无论如何我都会尝试你的代码,也许我做错了什么。
    • 对不起,我不明白你的评论。看,这里有一个问题(在问题本身中)调用和设置 OpenGL 状态的正确顺序。该代码适用于 JOGl,但 openGl 调用与 Android 上的相同:stackoverflow.com/questions/9500905/…。确保您以正确的顺序设置所有内容,并且您不会忘记任何事情。
    • 哦,我想我明白了。您使用 glDrawTexfoES。我不知道那真的是什么(在 OpenGL 文档中找不到)。只需制作一个四边形,绑定纹理并绘制四边形,就像我在之前评论中链接到的问题中所做的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多