2010-03-16 5 views
-1

Я собираю простой тест, состоящий из двух обучающих программ, доступных онлайн для OpenGL ES на Android. Это действительно так, что я могу узнать об основах OpenGL ES, чтобы лучше понять, как я должен проектировать свою программу.Простая 2D-плитка не рендеринга на Android

Прямо сейчас, когда он пытается визуализировать, эффект движения мыши работает, но квадрат не нарисован на экране.

Вот два исходных файлов я имею дело с:

import javax.microedition.khronos.egl.EGLConfig; 
import javax.microedition.khronos.opengles.GL10; 
import android.opengl.GLSurfaceView; 
import android.opengl.GLU; 

//Simple clear-screen renderer. 
class ClearRenderer implements GLSurfaceView.Renderer { 

    private float mRed; 
    private float mGreen; 
    private float mBlue; 

    private TileUI testTile; 

    public ClearRenderer() { 

     this.testTile = new TileUI(); 

    } 

    public void onSurfaceCreated(GL10 gl, EGLConfig config) { 

     gl.glShadeModel(GL10.GL_SMOOTH); 
     gl.glClearColor(0.0f, 0.0f, 0.0f, 0.5f); 
     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); 

    } 

    public void onSurfaceChanged(GL10 gl, int w, int h) { 

     gl.glViewport(0, 0, w, h); 
     gl.glMatrixMode(GL10.GL_PROJECTION); 
     gl.glLoadIdentity(); 

     // Calculate The Aspect Ratio Of The Window 
     GLU.gluPerspective(gl, 45.0f, (float)w/(float)h, 0.1f, 100.0f); 

     gl.glMatrixMode(GL10.GL_MODELVIEW); 
     gl.glLoadIdentity(); 

    } 

    public void onDrawFrame(GL10 gl) { 

     gl.glClearColor(mRed, mGreen, mBlue, 1.0f); 
     gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
     gl.glLoadIdentity(); 
     gl.glTranslatef(0.0f, 0.0f, 0.0f); 
     testTile.draw(gl); 

    } 

    public void setColor(float r, float g, float b) { 
     mRed = r; 
     mGreen = g; 
     mBlue = b; 
    } 

} 

Второй является сама плитка объект:

import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.nio.FloatBuffer; 

import javax.microedition.khronos.opengles.GL10; 

public class TileUI { 

    private float[] vertices = { 
     -1.0f, -1.0f, 0.0f,  // Bottom left 
     1.0f, -1.0f, 0.0f,  // Bottom right 
     -1.0f, 1.0f, 0.0f,  // Top left 
     1.0f, 1.0f, 0.0f   // Top right 
    }; 

    private FloatBuffer vertexBuffer; 

    public TileUI() { 

     ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length * 4); 
     byteBuf.order(ByteOrder.nativeOrder()); 
     vertexBuffer = byteBuf.asFloatBuffer(); 
     vertexBuffer.put(vertices); 
     vertexBuffer.position(0); 

    } 

    // Performs the actual drawing of a Tile. 
    public void draw(GL10 gl) { 

     // Set the face rotation. 
     gl.glFrontFace(GL10.GL_CW); 
     // Point to our vertex buffer. 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

     // Enable vertex buffer. 
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
     // Draw the vertices as a triangle strip. 
     gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, vertices.length/3); 
     // Disable the client state before leaving. 
     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);  

    } 

} 

Я обязательно заранее извиняюсь, это немного Франкенштейна, любая помощь и объяснение того, что здесь происходит, будут очень признательны.

ответ

1

Я думаю, что линия, которая вызывает у вас проблемы, - gl.glTranslatef(0.0f, 0.0f, 0.0f);. Это означает, что вы рисуете свой квад в начале координат, и это также, где камера, чтобы вы ее не видели. Попробуйте что-то вроде gl.glTranslatef(0.0f, 0.0f, -10.0f);. Это должно переместить квадрант в экран и поставить его перед вашей камерой. Кроме того, если вы делаете 2D-чертеж, вы можете использовать glOrtho() вместо gluPerspective(), и это даст вам орфографическую или плоскую проекцию.

+0

Знаете ли вы хороший учебник по действительному пониманию различий в проекциях? Особенно в контексте OpenGL (ES)? Я получаю довольно приличный дескриптор на всем этом, но мне хотелось бы, чтобы некоторые вещи были глубже погружены в смысл всех вызовов функций. Я действительно понимаю почти 20% звонков, сделанных здесь. –

+0

Учебники NeHe (http://nehe.gamedev.net/) являются стандартом дефакто, когда дело доходит до изучения OpenGL. Вы можете получить действительно хорошее представление об основах настройки и о том, что делает большинство вызовов, и 90% из них должны переходить на OpenGL ES. Похоже, что кто-то работает над переносом обучающих программ на Android, но я не знаю, насколько они полны. (http://insanitydesign.com/wp/projects/nehe-android-ports/) – CaseyB

+0

Я знаю эти учебные пособия, хотя здесь не так много объясняется, и я нахожу много деталей, которые теряются в переводе. Надеюсь, что что-то скоро появится, просто чтобы было легче впитываться. Спасибо! –

Смежные вопросы