Я собираю простой тест, состоящий из двух обучающих программ, доступных онлайн для 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);
}
}
Я обязательно заранее извиняюсь, это немного Франкенштейна, любая помощь и объяснение того, что здесь происходит, будут очень признательны.
Знаете ли вы хороший учебник по действительному пониманию различий в проекциях? Особенно в контексте OpenGL (ES)? Я получаю довольно приличный дескриптор на всем этом, но мне хотелось бы, чтобы некоторые вещи были глубже погружены в смысл всех вызовов функций. Я действительно понимаю почти 20% звонков, сделанных здесь. –
Учебники NeHe (http://nehe.gamedev.net/) являются стандартом дефакто, когда дело доходит до изучения OpenGL. Вы можете получить действительно хорошее представление об основах настройки и о том, что делает большинство вызовов, и 90% из них должны переходить на OpenGL ES. Похоже, что кто-то работает над переносом обучающих программ на Android, но я не знаю, насколько они полны. (http://insanitydesign.com/wp/projects/nehe-android-ports/) – CaseyB
Я знаю эти учебные пособия, хотя здесь не так много объясняется, и я нахожу много деталей, которые теряются в переводе. Надеюсь, что что-то скоро появится, просто чтобы было легче впитываться. Спасибо! –