Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android OpenGL纹理未渲染_Android_Opengl Es_Textures - Fatal编程技术网

Android OpenGL纹理未渲染

Android OpenGL纹理未渲染,android,opengl-es,textures,Android,Opengl Es,Textures,以下是我的GL初始化代码: gl.glEnable(GL10.GL_TEXTURE_2D); gl.glShadeModel(GL10.GL_SMOOTH); gl.glEnable(GL10.GL_BLEND); gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); gl.glDisable(GL10.GL_DEPTH_TEST); gl.glMatrixMode(GL

以下是我的GL初始化代码:

    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glShadeModel(GL10.GL_SMOOTH);

    gl.glEnable(GL10.GL_BLEND);
    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);

    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();

    gl.glViewport(0, 0, width, height);

    float left = 0;
    float right = width;
    float top = height;
    float bottom = 0;
    gl.glOrthof(left, right, top, bottom, -1, 1);

    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();

    textures.put("ball", new Texture(gl, BitmapFactory.decodeResource(context.getResources(), R.drawable.ball)));
这是我的纹理课

public class Texture
{
int[] texture = new int[1];

static int real_width = 0;
static int real_height = 0;

Texture(GL10 gl, Bitmap bmp)
{
    real_width = bmp.getWidth();
    real_height = bmp.getHeight();

    gl.glGenTextures(1, texture, 0);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
    bmp.recycle();

    int error = gl.glGetError();
    if (error != GL10.GL_NO_ERROR)
    { 
        Log.e("ROLL", "GL Texture Load Error: " + GLU.gluErrorString(error));
    }
}

public void draw(GL10 gl, float x, float y)
{
    draw(gl, x, y, real_width, real_height);
}

public void draw(GL10 gl, float x, float y, float w, float h)
{
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    float[] vertices = { x + w, y + h, x, y + h, x, y, x + w, y };
    float[] textureCoords = { 1, 1, 0, 1, 0, 0, 1, 0 };

    ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    FloatBuffer vertexBuffer = byteBuf.asFloatBuffer();
    vertexBuffer.put(vertices);
    vertexBuffer.position(0);

    byteBuf = ByteBuffer.allocateDirect(textureCoords.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    FloatBuffer textureBuffer = byteBuf.asFloatBuffer();
    textureBuffer.put(textureCoords);
    textureBuffer.position(0);

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

    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);

    gl.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0, 4);

    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

}
}
我遇到的问题是,除了一个形状和纹理位置正确的白色框之外,什么都没有画

图像大小为50x50,我认为这是由于2 thing的强大,但这个问题也发生在模拟器上

此外,我确实在日志中得到一个错误,它说:“GL纹理加载错误:无效值”,但我不知道这意味着什么

最后,我像这样绘制纹理:

gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

textures.get("ball").draw(gl, 10, 10);
发件人:

  • 如果internalFormat不是1、2、3、4或1,则生成GL_无效_值 可接受的分辨率和格式符号常量之一
  • 如果宽度或高度小于0或 大于2+最大纹理大小
  • 如果不使用两个纹理的非幂,则生成GL_无效_值 支持,宽度或高度不能表示为2k+2 某个整数值k的边界
  • 如果边框不是0或1,则生成GL_无效_值
我认为内部格式是错误的。试着为您自己指定它怎么样。您可以找到更多关于GLUtils的文档

但正如我第一次看到的,在将纹理加载到GL之前,并没有绑定纹理

gl.glGenTextures(1, texture, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, texture[0]); 

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
bmp.recycle();
我在做:

  • 将所有图像移动到res/drawable nodpi
  • 放大到2的幂,在linux中,mogrify将完成这项工作(find.-exec mogrify-scale'512x512!'{}\;)
  • 如果从外部资源加载纹理,此代码将转换为大小为2的最近幂的位图

    public class ScalePowerof2 { // some devices require to scale texture bitmaps to power of 2 size 'ScalePower2.scalePowerof2(Bitmpap)' does the job
    private static boolean isPowerof2(int v) { // is v a 2^n ?
        for (int i=1; i!=0; i<<=1) if (v==i) return true;
        return false;
    }
    private static int closestPowerof2(int v) { // n | 2^n <= v
        for (int i=1; i!=0; i<<=1) if (i>=v) return i;
        return 0;
    }
    public static Bitmap scalePowerof2(Bitmap bmp) {
        Bitmap b=null;
        if (bmp!=null) {
            int w=bmp.getWidth(), h=bmp.getHeight();
            if (isPowerof2(w) & isPowerof2(h)) return bmp; // ok, both 2^n nothing to do
            w=closestPowerof2(w); h=closestPowerof2(h); // new 2^n values
            b=Bitmap.createScaledBitmap(bmp, w, h, false);
        }
        return b;
    }
    
    public class ScalePowerof2{//一些设备需要将纹理位图缩放到2倍大小的“ScalePower2.ScalePowerof2(Bitmpap)”来完成这项工作
    私有静态布尔值isPowerof2(int v){//v是2^n吗?
    
    对于(int i=1;i!=0;i)这里是用于加载纹理的代码?