gl texture error op sommige telefoons

Ik ontdekte op een paar telefoons dat sommige van mijn texturen in mijn glSurfaceView niet geladen waren (alleen maar wit) na wat googlen. Ik heb setDebugFlags (DEBUG_CHECK_ERROR) ingesteld om het volgende foutenlogboek hieronder op te halen. regel 40 in MenuButton.java is:

gl.glGenTextures(1, textures, 0);

waar texturen mijn texture pointer is, aangegeven als:

private int[] textures = new int[1];

Ik ben stomverbaasd, omdat ik dit probleem alleen heb gezien met de Droid Pro en een paar andere telefoons en ik weet niet zeker hoe gl.glGenTextures een ongeldige waarde zou hebben. Alle gedachten zouden nuttig zijn.

EDIT: de code voor menuknop is hieronder vermeld.

12-06 17:46:31.720: E/AndroidRuntime(2984): android.opengl.GLException: invalid value
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLErrorWrapper.glGenTextures(GLErrorWrapper.java:350)
12-06 17:46:31.720: E/AndroidRuntime(2984): at com.huskybuspurchased.MenuButton.(MenuButton.java:40)
12-06 17:46:31.720: E/AndroidRuntime(2984): at com.huskybuspurchased.CampusMap.onSurfaceCreated(CampusMap.java:112)
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1348)
12-06 17:46:31.720: E/AndroidRuntime(2984): at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1118)
12-06 17:46:31.728: I/hb(2984): rendering thread paused.

A pic of the issue: enter image description here

package com.huskybus;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import javax.microedition.khronos.opengles.GL10;
import android.graphics.Bitmap;
import android.opengl.GLUtils;
import android.util.Log;
import android.view.MotionEvent;

public class MenuButton {
//Our texture.
private float texture[] = {
        //Mapping coordinates for the vertices
        0.0f, 1.0f,
        1.0f, 1.0f,
        0.0f, 0.0f,
        1.0f, 0.0f, 
};
// The order we like to connect them.
private byte indices[] = {0,1,3,2};
// Our vertex buffer.
private FloatBuffer vertexBuffer;
// Our index buffer.
private ByteBuffer indexBuffer;
//texture buffer.
private FloatBuffer textureBuffer;
//Our texture pointer.
private int[] textures = new int[1];
private int width;
private int height;
private float rotation;
public MenuButton(Bitmap graphic,int _rotation,GL10 gl, int _width, int _height) {
    rotation=_rotation;
    width=_width;
    height=_height;

        //Generate one texture pointer...
        gl.glGenTextures(1, textures, 0);
        //...and bind it to our array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        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_CLAMP_TO_EDGE);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
        //Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, graphic, 0);
        graphic.recycle();

    float vertices[] = {
            0, -height, 0.0f, //LB
            width, -height, 0.0f,  //RB
            0, 0, 0.0f,  //LT
            width, 0, 0.0f,   //RT
        };

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

    //
    byteBuf = ByteBuffer.allocateDirect(texture.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    textureBuffer = byteBuf.asFloatBuffer();
    textureBuffer.put(texture);
    textureBuffer.position(0);
    //
    indexBuffer = ByteBuffer.allocateDirect(indices.length);
    indexBuffer.put(indices);
    indexBuffer.position(0);        
}

/**
 * This function draws our square on screen.
 * @param gl
 */
public void draw(GL10 gl) {
    //Bind our only previously generated texture in this case
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
    //Point to our buffers
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    //Set the face rotation
    gl.glFrontFace(GL10.GL_CCW);
    //Enable the vertex and texture state
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
    gl.glRotatef(rotation, 0, 0, 1);
    //Draw the vertices as triangles, based on the Index Buffer information
    gl.glDrawElements(GL10.GL_TRIANGLE_FAN, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
    gl.glRotatef(360-rotation, 0, 0, 1);

   //Disable the vertices buffer.
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    //Disable the texture buffer.
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
   //Disable face culling.
    gl.glEnable(GL10.GL_CULL_FACE);
}
public boolean amIHit(float[] matrixValues,MotionEvent event) {
    if  (((event.getX())>(0)&&((event.getX()))<5+width)&&((event.getY())>0)&&(event.getY()

}

3
Ik heb ook net mijn app getest op de Droid Pro SDK off motodev's site en het werkt prima in die door motorola geleverde emulator
toegevoegd de auteur jfisk, de bron
Ze hebben de macht van 2 en ik betwijfel of het laag is in het videogeheugen, want als ik de GLWrapper uitschakel, gaat het door met het laden van andere grotere texturen. Het werkt ook perfect op de originele droid die minder ram en een minder krachtige GPU heeft
toegevoegd de auteur jfisk, de bron
@Jim Buck heeft ook 3 nodig
toegevoegd de auteur jfisk, de bron
glGenTextures neemt slechts 2 parameters in beslag. Hoe compileert uw code?
toegevoegd de auteur Jim Buck, de bron
Hmm, moet dan Java/Android-specifiek zijn. Het is geen OpenGL-specificatie. :)
toegevoegd de auteur Jim Buck, de bron
Zijn uw textuurafmetingen veelvouden van 2 (16,32,64,128 etc.)? Of kan het een hardwareprobleem zijn? Misschien is er niet genoeg videogeheugen voor de texturen (probeer de grootte te verkleinen (maar houd het nog steeds een veelvoud van 2) en kijk of het resultaat anders is)?
toegevoegd de auteur Jave, de bron
En trouwens; "GL_INVALID_VALUE wordt gegenereerd als n negatief is." volgens opengl.org/sdk/docs/man/xhtml/glGenTextures. xml
toegevoegd de auteur Jave, de bron
Ik denk dat je het (en andere gerelateerde telefoons) kunt opzoeken op glbenchmark.com om te zien of iets in je project wordt niet ondersteund ...
toegevoegd de auteur Jave, de bron

2 antwoord

glSurfaceView kiest een te renderen oppervlak en verschillende Android-apparaten ondersteunen verschillende oppervlakken en helaas hebben we geen gemeenschappelijke subset die door iedereen wordt ondersteund. dus het maakt het lastig om te kiezen.
Standaard probeert glSurfaceView een oppervlak te vinden dat zich in de buurt van een 16-bits dieptebuffer bevindt.
U moet dus een afbeelding gebruiken voor uw texture-doel met een 16-bits dieptebuffer of mogelijk 24 bit. Hogere bitdiepte-afbeeldingen kunnen op bepaalde apparaten problemen veroorzaken. !!

2
toegevoegd
de texturen waar ik problemen mee heb zijn 24 bit PNG's, wat zou het beste formaat zijn om de beste kans op compatibiliteit te waarborgen?
toegevoegd de auteur jfisk, de bron
dan kun je proberen voor 16 bit diepte. kijk hier eens naar. developer.android.com/reference/android/opengl/& hellip;
toegevoegd de auteur Aakash, de bron

U hoeft niet noodzakelijkerwijs glGenTextures te bellen. U kunt uw texturen de gewenste numerieke waarde geven - glGenTextures was gewoon bedoeld als een gemak om een ​​texture-nummer te krijgen dat nog niet was gebruikt.

0
toegevoegd
wanneer ik niet de texturen nog helaas niet zal laden
toegevoegd de auteur jfisk, de bron
Ik heb de vraag bijgewerkt met code van de betreffende klas.
toegevoegd de auteur jfisk, de bron
We hebben helaas meer informatie nodig om verder te gaan.
toegevoegd de auteur StilesCrisis, de bron