Треугольник рисования с использованием OpenGl не отображается?

Я пытаюсь сделать свое первое приложение. Основанный на OpenGl, я пытаюсь нарисовать треугольник, и wHEN

RUNNING Приложение. Он просто отображает черный экран без треугольника.

1-Я не знаю, где моя ошибка? 2-есть ли хорошая книга / учебники для начинающих, чтобы открыть Android?

Треугольный класс:

public class Triangle { private FloatBuffer vertxBuffer; protected static byte indices[] = { //Face definition: 0,1,3, //lower-right triangle of the face is drawn with vertices vertices[0]->vertices[1]->vertices[3] (->vertices[0]) 0,3,2 //upper-right triangle of the face is drawn with vertices vertices[0]->vertices[3]->vertices[2] (->vertices[0]) }; public float vertices[] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.0f, 0.5f, 0.0f }; public Triangle() { // float has 4 bytes, so we allocate for each coordinate 4 bytes. //what is the difference between ByteBuffer.allocateDirect AND ByteBuffer.allocate??? ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4); vertexByteBuffer.order(ByteOrder.nativeOrder()); // allocate the memory from the byte buffer vertxBuffer = vertexByteBuffer.asFloatBuffer(); //fill the vertex buffer with the vertices vertxBuffer.put(vertices); // set the cursor position to the beginning of the buffer vertexByteBuffer.position(0); } protected static ByteBuffer indexBuffer; static { indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); } public void draw(GL10 gl) { // Because we store the Triangle vertices " Coordinates " in a FloatBuffer // we need to enable OpenGL to read from it. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); //set the color for the Triangle (r, g, b, alpha) alpha is between 0-1 gl.glColor4f(2.0f, 1.0f, 0.0f, 0.5f); // point to our vertex buffer to extract the vertices from it. //(numberOfVertices, Which type of data the buffer Holds, offset, our Buffer containing the Vertices) gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertxBuffer); //draw the vertices as triangle strip gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3 ); gl.glDrawElements(gl.GL_TRIANGLES, indices.length, gl.GL_UNSIGNED_BYTE, indexBuffer); //disable the client state before leaving gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); } 

}

Класс GLRenderer:

 public class GLRenderer implements Renderer{ private Triangle triangle; public GLRenderer() { this.triangle = new Triangle(); } @Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub // clear screen and depth buffer gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); // reset the mode view matrix gl.glLoadIdentity(); // Drawing gl.glTranslatef(0.0f, 0.0f, -5.0f); triangle.draw(gl); } @Override public void onSurfaceChanged(GL10 gl, int width, int height) { // TODO Auto-generated method stub if (height == 0) { height = 1; } //Reset the current View Port gl.glViewport(0, 0, width, height); //Select the Projection Matrix gl.glMatrixMode(GL10.GL_PROJECTION); // Reset the Projection Matrix gl.glLoadIdentity(); // calculate the aspect ratio of the window GLU.gluPerspective(gl, 45.0f, (float) width/(float) height, 0.1f , 100.0f); gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); } @Override public void onSurfaceCreated(GL10 gl, EGLConfig config) { // TODO Auto-generated method stub gl.glClearColor(0, 0, 0, 1.0f); 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); gl.glShadeModel(GL10.GL_SMOOTH); gl.glDisable(GL10.GL_DITHER); } 

}

Класс OpenGlRenderActivity:

 public class OpenGLRenderActivity extends Activity { /** Called when the activity is first created. */ private GLSurfaceView gLSurfaceView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); gLSurfaceView = new GLSurfaceView(this); gLSurfaceView.setRenderer(new GLRenderer()); setContentView(gLSurfaceView); } @Override protected void onResume() { super.onResume(); gLSurfaceView.onResume(); } @Override protected void onPause() { super.onPause(); gLSurfaceView.onPause(); } 

}

Я думаю, вам нужно объявить индексы для вашей вершины (для составления строк и граней):

 protected static byte indices[] = { //Face definition: 0,1,3, //lower-right triangle of the face is drawn with vertices vertices[0]->vertices[1]->vertices[3] (->vertices[0]) 0,3,2 //upper-right triangle of the face is drawn with vertices vertices[0]->vertices[3]->vertices[2] (->vertices[0]) }; protected static ByteBuffer indexBuffer; static { indexBuffer = ByteBuffer.allocateDirect(indices.length); indexBuffer.put(indices); indexBuffer.position(0); } 

Затем передайте эти индексы вашему призыву на призыв:

(заменить

 gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3 ); 

с

gl.glDrawElements(GL.GL_TRIANGLES, indices.length, GL.GL_UNSIGNED_BYTE, indexBuffer) ;

)

Что касается учебников, у вас есть отличные версии Android для учебных пособий Nehe:

http://insanitydesign.com/wp/projects/nehe-android-ports/

Это скорее код, чем текстовые объяснения, но они начинают очень медленно, и код хорошо подойдет. На самом деле, я думаю, что один из первых tutrials просто показывает, как рисовать треугольник так же, как вы здесь пытаетесь.

Ваши треугольники обрезаются рядом с плоскостью отсечения. Попробуйте переместить его в диапазон между близкими и дальними значениями gluPerspective.

В этом андроид-руководстве упоминается требование vertexShader, fragmentShader и Program. Возможно, я пропустил это, но я не вижу в коде никакого отношения. В моем случае исправление для невидимого треугольника состояло в том, чтобы зафиксировать тип-o в моем фрагменте.