2011-02-06 56 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