Итак, я создаю приложение для Android с OpenGL ES 1.0. Моя проблема в том, что объекты, которые нарисованы с использованием GL_TRIANGLES, не отображаются на Android 3.x и 4.x, но все отлично работает на 2.x. Есть ли что-нибудь, что нужно включить или отключить раньше?
OpenGL ES 1.0 GL_TRIANGLES, работающий на Android 2.3, но не на 3.x/4.x
Файл с GL_TRIANGLES (Model.java):
public class Model() {
private FloatBuffer vertexBuffer;
private ByteBuffer indexBuffer;
private FloatBuffer colorBuffer;
byte indices[] = {0, 1, 2};
float vertices[];
float colors[] = {1.0f, 1.0f, 1.0f, 1.0f};
public load(int resid, Context context) {
ModelLoader.load(context, resid);
vertices = ModelLoader.vertices();
colors = ModelLoader.colors();
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
vbb.order(ByteOrder.nativeOrder());
vertexBuffer = vbb.asFloatBuffer();
vertexBuffer.put(vertices);
vertexBuffer.position(0);
ByteBuffer cbb = ByteBuffer.allocateDirect(colors.length * 4);
cbb.order(ByteOrder.nativeOrder());
colorBuffer = cbb.asFloatBuffer();
colorBuffer.put(colors);
colorBuffer.position(0);
indexBuffer = ByteBuffer.allocateDirect(indices.length);
indexBuffer.put(indices);
indexBuffer.position(0);
}
public void draw(GL10 gl) {
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl.glDrawArrays(GL10.GL_TRIANGLES, 0, vertices.length/3);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
}
}
Файл с визуализации (GLRender.java):
public class GLRender extends GLSurfaceView.Renderer {
public Model sample = new Model();
public void onSurfaceChanged(GL10 gl, int w, int h) {
if(h==0) h=1;
float aspect = (float)w/h;
gl.glViewport(0, 0, w, h);
gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
GLU.gluPerspective(gl, 45, aspect, 0.1f, 100.0f);
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
}
public void onSurfaceCreated(GL10 gl, EGLConfig glc) {
gl.glClearColor(0, 0, 0, 1.0f);
gl.glClearDepthf(1.0f);
gl.glEnable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_CULL_FACE);
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);
gl.glEnable(GL10.GL_LIGHTING);
gl.glEnable(GL10.GL_LIGHT0);
gl.glEnable(GL10.GL_COLOR_MATERIAL);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_BLEND);}
public void onDrawFrame(GL10 gl) {
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity(); // Reset model-view matrix (NEW)
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glPushMatrix();
sample.draw(gl);
gl.glPopMatrix();
}
}
Я думаю, что это достаточно.
Приведенный выше код не является проблемой. Он работает (по крайней мере, на сотах).
поднимите свой код, что облегчит людям выявление проблемы – JRowan
@JRowan Я попытался удалить все функции глубины, но ничего не произошло. – pfoof
Да, это не относится к вам, я просто вижу ваш код, честно говоря, я как бы зацикленный, обычно, если он будет работать на старшем андроиде, а не на более позднем андроиде, вероятно, что-то связано с вашим порядком включения функций gl и такие, все, что я могу сказать вам, попытаться прокомментировать одну вещь, может быть, пару разных за раз, посмотрите, будет ли она работать, вы должны иметь глубину, хотя из-за того, что ваш код имеет gluperspective, а не орто – JRowan