2012-04-09 5 views
-1

Ich habe eine BMP Größe = 512 * 512, und jetzt möchte ich es verwenden, um eine Oberfläche zu rendern, da die Oberfläche nicht glatt ist, schneide ich die Oberfläche in ein kleines Stück Rechteck (num = rowMax * COLMAX), der Code wie folgt:android opengl GLUtil.texImage2d

draw(GL10 gl) 
{ 
    int[] textures = new int[]; 
    gl.glBindTexture(...); 
    gl.glTxtParameterf(...); 

for(int row =0; row< maxRow; row++) 
{ 
    for(int col=0; col<maxCol; col++ 
    { 
    GLUtil.texImage2D(GL10.GL_TEXTURE_2D , bitmap,0);// bitmap is the 512*512 bmp 
    //generate 4 point coordinate 
    ... 

    //generate texture uv coordinate 
    ... 
    //draw it 
    gl.glDrawArray(...);  
    } 
    } 

} es funktioniert gut.

aber wenn ich die Aussage nehme:
GLUtil.texImage2D (GL10.GL_TEXTURE_2D, Bitmap, 0); aus der Schleife, (da ich denke, dass dies eine Menge Zeit in Anspruch nehmen) es nicht, ich funktioniert nicht wissen, w

}

+0

Es gibt kein 'texImage2D'3' in [GLUtils] (http://developer.android.com/reference/android/opengl/GLUtils.html). –

Antwort

1

Vielleicht habe ich nicht die Art und Weise Ihr Programm verstehen funktioniert, aber von dem, was ich verstehe, haben Sie verschiedene Texturen, die Sie zeichnen müssen.

Wenn Sie das texImage2D aus der Schleife nehmen würden, würden Sie nur eine Textur anstelle von num Textur laden, so offensichtlich würde das nicht funktionieren.

Eine andere Sache, die Sie über open gl wissen sollten, ist, dass Sie GLUtil.texImage2D nicht jedes Mal aufrufen müssen, wenn Sie zeichnen, sondern nur jedes Mal, wenn sich die Textur ändert.

Sobald Sie texImage2D aufgerufen haben, wird der aktuelle Bitmap-Status im Texturspeicher des GL-Kontextes unter dem zuvor mit glBindTexture(GL10.GL_TEXTURE_2D, /*texture name here*/) bezeichneten Texturnamen gespeichert. Wenn Sie also das nächste Mal die Textur zeichnen müssen, müssen Sie nur aufrufen glBindTexture mit dem Namen der Textur, und das ist es, keine kostspieligen Operationen benötigt.

Sie sollten es so machen, dass der Name jeder Textur (eine eindeutige Ganzzahl für die Textur) ihre Position ist (= (row * maxCol) + col) + 1 (damit Sie keine Textur haben Name 0 (reservierter Texturname)

Außerdem sollten Sie ein Array booleans der Größe von num namens mDirty erstellen, so dass jede Zelle wahr ist, wenn die Textur der Position der Zelle geändert hat und sein muss reloaded

Auf diese Weise können Sie in der Schleife nur überprüfen, ob mDirty[(row * maxCol) + col] == true, und wenn es wahr ist, dann rufen Sie TexImage2D, und legen Sie MDirty [(row * maxCol) + col] auf falsch, um anzuzeigen, dass die Textur aktualisiert wird im gl Speicher.

+0

tatsächlich gibt es nur eine Textur, jedes Mal, wenn ich einen Teil von ihnen verwende, zum Beispiel den oberen linken Teil 64 * 64 Pixel. Jedes Mal, wenn GLUtils.glTexImage2D dieselbe Bitmap in die Textur lädt, ist das teuer. Gibt es eine Möglichkeit, die nur einmal geladen wird? – dormi330

+0

oh, in diesem Fall, verschieben Sie die glTex aus der Schleife, und platzieren Sie einen glBindTexture (GL10.GL_TEXTURE_2D,/* texture name here * /) Befehl davor. – saarraz1