2011-02-06 59 views
0

我正在開發Android遊戲,並正在學習OpenGL ES。我已經使用了OpenGL,不過現在已經有一段時間了。我最近主要使用DirectX與C++,所以我很理解圖形API的概念。在OpenGL ES中爲Android 2.1繪製基本VBO三角形的問題

當我自己玩API時,我無法得到我預期的結果,我轉向this我在網上找到的教程看起來相當全面,儘管我很容易理解並且嚴格遵循教程,我仍然無法讓屏幕顯示一個簡單的正方形(目前不使用除了沒有顏色的頂點數組以外的其他任何東西)。

下面是我的渲染器類的代碼,我一直在盯着一段時間,並且因爲無法找到我的錯誤而開始有點瘋狂。我用圖形API(在DirectX和OpenGL中)做了更復雜的事情,所以我覺得這種尷尬,只是需要有人指出我可能明顯明顯的疏忽。

預先感謝您!

public class GameRenderer implements Renderer { 

private float red, green, blue = 0.0f; 

private final float vertices[] = { 
     0.5f, -0.5f, 0.0f, // 0, Bottom Right 
     0.5f, 0.5f, 0.0f, // 1, Top Right 
     -0.5f, 0.5f, 0.0f, // 2, Top Left 
     -0.5f, -0.5f, 0.0f, // 3, Bottom Left 
}; 

private final short indices[] = { 
     0, 1, 2, 0, 2, 3 
}; 


private final float colours[] = { 
     1.0f, 1.0f, 1.0f, 
     0.5f, 0.5f, 0.5f, 
     0.5f, 0.5f, 0.5f, 
     0.0f, 0.0f, 0.0f 
}; 

FloatBuffer vFBuff; 
FloatBuffer cFBuff; 

ShortBuffer iSBuff; 

public GameRenderer(){ 
    super(); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 

    gl.glClearColor(red, green, blue, 0.5f); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 

    gl.glLoadIdentity(); 
    gl.glScalef(2.0f, 2.0f, 0.0f); 
    gl.glTranslatef(0.0f, 0.0f, -4f); 

    gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_SHORT, iSBuff); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // TODO Auto-generated method stub 
    // set viewport 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.0f, 100.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
} 

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

    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glClearDepthf(1.0f); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
    gl.glDepthFunc(GL10.GL_LEQUAL); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST); 

    ByteBuffer vBBuff = ByteBuffer.allocateDirect(vertices.length * 4); 
    ByteBuffer cBBuff = ByteBuffer.allocateDirect(colours.length * 4); 
    ByteBuffer iBBuff = ByteBuffer.allocateDirect(indices.length * 2); 

    vFBuff = vBBuff.asFloatBuffer(); 
    vFBuff.put(vertices); 
    vFBuff.position(0); 

    cFBuff = cBBuff.asFloatBuffer(); 
    cFBuff.put(colours); 
    cFBuff.position(0); 

    iSBuff = iBBuff.asShortBuffer(); 
    iSBuff.put(indices); 
    iSBuff.position(0); 

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vFBuff); 

    gl.glFrontFace(GL10.GL_CCW); 
    gl.glEnable(GL10.GL_CULL_FACE); 
    gl.glCullFace(GL10.GL_BACK); 
} 

public void setColour(float r, float g, float b) { 
    red = r; 
    blue = b; 
    green = g; 
} 

回答

0
GLU.gluPerspective(gl, 45.0f, (float)width/(float)height, 0.0f, 100.0f); 

不要設置你的zNearto zero

如果(r = zFar/zNear)粗略的深度緩衝精度log2(r)位都將丟失。由於r爲zNear接近0趨近於無窮大,zNear絕不能設置爲0。

+0

它當前設置爲0,就是因爲我原來的值(這是10.0f,這是我在其他項目中正常使用)沒有工作,而0.0f是我在接下來的教程中使用的,我假定爲原作者工作。無論哪種方式,我的廣場不渲染。 – Andrew 2011-02-06 15:18:53