2011-03-25 29 views
0

我正在爲Android(api 3)寫一個小程序,在黑屏上顯示一個白色的三角形。但是當我注意到將glTranslatef調用改爲glTranslatex(在onDrawFrame()方法中)時,我感到非常驚訝,這使我的三角形看不見!有人能解釋我發生了什麼嗎?如果我使用glTranslatex代替glTranslatef,我什麼都看不到!

這裏我呈示

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

import android.opengl.GLSurfaceView.Renderer; 
import android.opengl.GLU; 

public class TheRenderer implements Renderer { 

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 

    gl.glTranslatef(0, 0, -6); // Here my problem 
    triangle.draw(gl); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    if (height == 0) 
     height = 1; 
    gl.glViewport(0, 0, width, height); 

    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 60.0f, (float) width/(float) height, 1, 10); 
} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

} 

private GLSimple2DTriangle triangle = new GLSimple2DTriangle(); 
} 

下面的代碼,三角

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.ShortBuffer; 

import javax.microedition.khronos.opengles.GL10; 

public class GLSimple2DTriangle { 

    public GLSimple2DTriangle(){ 
     buildVerticesBuffer(); 
    } 

    public void draw(GL10 gl){ 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     gl.glVertexPointer(COORDS_PER_VERTEX, GL10.GL_SHORT, 0, verticesBuffer); 
     gl.glDrawArrays(GL10.GL_TRIANGLES, 0, VERTICES_NUMBER); 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    } 

    private void buildVerticesBuffer(){ 
     final short vertices [] = { 
       +0, +1, 
       +1, -1, 
       -1, -1 
     }; 

     ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * SHORTS_SIZE_BYTES); 
     byteBuffer.order(ByteOrder.nativeOrder()); 
     verticesBuffer = byteBuffer.asShortBuffer(); 
     verticesBuffer.put(vertices); 
     verticesBuffer.rewind(); 
    } 

    private ShortBuffer verticesBuffer; 
    private static final byte SHORTS_SIZE_BYTES = 2; 
    private static final byte COORDS_PER_VERTEX = 2; 
    private static final byte VERTICES_NUMBER = 3; 
} 

問候

回答

3

glTranslatex代碼爲定點版本。 OpenGL-ES使用16.16定點格式,所以整數座標應該向左移16位,以獲得相同的結果。您的翻譯電話將變成glTranslatex(0, 0, -6 << 16)。現在,如果沒有這個轉變,值-6實際上是-0.00009(-6/65536),所以你的物體被近平面剪切。

+0

非常感謝:)你認爲我應該使用浮點版本或定點版本,如果我想優化? – loloof64 2011-03-25 19:31:22

相關問題