【问题标题】:glDrawTexfOES draws black texture on phone, and correct in emulatorglDrawTexfOES 在手机上绘制黑色纹理,并在模拟器中正确
【发布时间】:2014-05-11 08:19:44
【问题描述】:

我正在使用 OpenGL 编写一个 2D 游戏,使用存储在我的资源中的 png 图像(64x64 像素,具有透明度)。

我的代码如下所示:

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import javax.microedition.khronos.opengles.GL11;
import javax.microedition.khronos.opengles.GL11Ext;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;
import android.opengl.GLSurfaceView.Renderer;

public class TestGLRenderer implements Renderer {

    private int mTexGLNames[];
    private Context mContext;

    public TestGLRenderer(Context ctx) {
        mContext = ctx;
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        // setup the gl renderer
        gl.glClearColor(0.2f, 0.4f, 0.6f, 1.0f);
        gl.glEnable(GL10.GL_TEXTURE_2D);
        gl.glShadeModel(GL10.GL_FLAT);
        gl.glEnable(GL10.GL_BLEND);
        gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);

        // reserve GL texture names
        mTexGLNames = new int[1];
        gl.glGenTextures(1, mTexGLNames, 0);

        // load image from resources
        Bitmap b;
        b = BitmapFactory.decodeResource(mContext.getResources(),
                R.drawable.image);

        // load image in opengl
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, b, 0);
    }

    public void onDrawFrame(GL10 gl) {
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, mTexGLNames[0]);
        int crop[] = new int[] { 0, 64, 64, -64 };

        ((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D,
                GL11Ext.GL_TEXTURE_CROP_RECT_OES, crop, 0);
        ((GL11Ext) gl).glDrawTexfOES(160, 240, 0, 64, 64);
    }

    public void onSurfaceChanged(GL10 gl, int w, int h) {
    }

}

结果在模拟器(运行 Android 2.2)中按预期工作,但图像在我的手机(LG-P500,Android 2.2)上显示为黑色方块。附件是模拟器和我的手机的屏幕截图。

是我的代码有问题,还是我的手机有问题(我的手机可以运行其他3D游戏没有问题)?

【问题讨论】:

    标签: android opengl-es


    【解决方案1】:

    我不确定它的原因是否与您相同,但请尝试一下。

    我之前加载了纹理(和你一样的问题):

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]);
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); 
    

    这在模拟器中运行良好,但您可以设置更多参数来设置其计算方式。我的猜测是手机默认无法设置这些,这就是为什么它不起作用(但这只是猜测)。所以解决方案:

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[i]); //Same
    
    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_WRAP_S, GL10.GL_REPEAT);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
    
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmaps[i], 0); //Same
    

    就是这样。如果您不知道,您可以从这些参数(GL_LINEAR 和 GL_REPEAT)中搜索更多信息。

    我希望这会有所帮助 =)

    【讨论】:

    • 确实,我认为这些设置具有默认值(在我使用的大多数框架中都有)。在明确它们之后,它现在可以工作了。
    猜你喜欢
    • 2012-01-12
    • 2014-11-29
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    • 2017-09-18
    • 2016-05-10
    相关资源
    最近更新 更多