Android Emulator与手机opengl不一致

Android Emulator与手机opengl不一致,android,opengl-es,Android,Opengl Es,我遇到了一个问题,我的应用程序在我的模拟器上看起来不错,但在我的手机上它只显示了我场景的一部分 图像(模拟器位于右侧 这里可以看到我的渲染器代码。(这个类是抽象的,但实现类所做的只是绘制多边形) 公共抽象类AbstractRenderer实现渲染器{ 浮动x=0.5f; 浮动y=1f; 浮点数z=3; 布尔显示坐标系统=真; 已创建表面上的公共空白(GL10 gl、EGLConfig EGLConfig){ gl.glDisable(GL10.gl\u抖动); gl.glHint(GL10.gl

我遇到了一个问题,我的应用程序在我的模拟器上看起来不错,但在我的手机上它只显示了我场景的一部分

图像(模拟器位于右侧

这里可以看到我的渲染器代码。(这个类是抽象的,但实现类所做的只是绘制多边形)

公共抽象类AbstractRenderer实现渲染器{
浮动x=0.5f;
浮动y=1f;
浮点数z=3;
布尔显示坐标系统=真;
已创建表面上的公共空白(GL10 gl、EGLConfig EGLConfig){
gl.glDisable(GL10.gl\u抖动);
gl.glHint(GL10.gl\u透视图\u校正\u提示,GL10.gl\u最快);
gl.glClearColor(.5f、.5f、.5f、1);
gl.glShadeModel(GL10.glu平滑);
gl.glEnable(GL10.gl_深度_试验);
}
表面上的公共空隙已更改(GL10 gl、int w、int h){
gl.glViewport(0,0,w,h);
浮动比率=(浮动)w/h;
gl.glMatrixMode(GL10.gl_投影);
gl.glLoadIdentity();
gl.glFrustumf(-ratio,ratio,-1,1,0,10);
}
公共框架(GL10 gl){
gl.glDisable(GL10.gl\u抖动);
gl.glClear(GL10.gl_颜色_缓冲_位| GL10.gl_深度_缓冲_位);
gl.glMatrixMode(GL10.gl_MODELVIEW);
gl.glLoadIdentity();
GLU.gluLookAt(gl,x,y,z,0f,0,0f,0f,1f,0f);
gl.glEnableClientState(GL10.gl_顶点数组);
if(显示协调系统){
绘图坐标系统(gl);
}
绘图(gl);
//gl.glFlush();
}
专用坐标系统(GL10 gl){
ByteBuffer vbb=ByteBuffer.allocateDirect(6*3*4);
vbb.order(ByteOrder.nativeOrder());
FloatBuffer顶点=vbb.asFloatBuffer();
ByteBuffer ibb=ByteBuffer.allocateDirect(6*2);
ibb.order(ByteOrder.nativeOrder());
ShortBuffer index=ibb.asShortBuffer();
最终浮动坐标长度=27f;
//添加点(-1,0,0)
顶点。放置(-coordLength);
顶点。放置(0);
顶点。放置(0);
//添加点(1、0、0)
顶点。放置(坐标长度);
顶点。放置(0);
顶点。放置(0);
//添加点(0,-1,0)
顶点。放置(0);
顶点。放置(-coordLength);
顶点。放置(0);
//添加点(0,1,0)
顶点。放置(0);
顶点。放置(坐标长度);
顶点。放置(0);
//添加点(0,0,-1)
顶点。放置(0);
顶点。放置(0);
顶点。放置(-coordLength);
//添加点(0、0、1)
顶点。放置(0);
顶点。放置(0);
顶点。放置(坐标长度);
对于(int i=0;i<6;i++){
指数.put((short)i);
}
顶点位置(0);
指数。位置(0);
gl.glColor4f(1,1,0,0.5f);
gl.glVertexPointer(3,GL10.gl_FLOAT,0,顶点);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
排名(2);
gl.glColor4f(0,1,0,0.5f);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
排名(4);
gl.glColor4f(0,0,1,0.5f);
gl.gld元素(GL10.gl\u行,2,GL10.gl\u无符号\u短,索引);
}
受保护的抽象无效图纸(GL10 gl);
}
我的猜测是,我没有设置emulator实现默认设置的值。唯一的问题是我不知道该值可能是什么


希望能听到你们这些家伙的声音!

这是一个深度缓冲区问题:从手册页的“备注”部分:

“近”不能设置为0


您应该计算距离相机尽可能远的“近”值,以及距离尽可能近的值,同时仍然包含要绘制的内容。

这是深度缓冲区问题:从手册页的“注释”部分:

“近”不能设置为0


您应该计算距离摄影机尽可能远的“近”值,以及距离摄影机尽可能近的值,同时仍包含要绘制的对象。

此外,看起来您的顶点距离摄影机27个单位,而您的“远”距离仅为10个单位。良好的起点应该是gl.glFrustumf(..,0.1f,100.0f);然后你可以按照ryanm的建议调整这些值。@Gilead我不太关心不能在全长atm上显示的顶点(无论如何,它们在发布应用程序之前都会消失)。但是,您确实提供了一种有用的方法来调整frustrum的正确值。Thx非常适合您的输入!而且,看起来您的顶点距离摄影机27个单位,距离仅为10个单位。良好的起点应该是gl.glFrustumf(..,0.1f,100.0f);然后你可以按照ryanm的建议调整这些值。@Gilead我不太关心不能在全长atm上显示的顶点(它们在发布应用程序之前就已经消失了。)。不过,你确实提供了一种有用的方法来调整frustrum.Thx的正确值,以供输入!
public abstract class AbstractRenderer implements Renderer {
float x = 0.5f;
float y = 1f;
float z = 3;

boolean displayCoordinateSystem = true;

public void onSurfaceCreated(GL10 gl, EGLConfig eglConfig) {
    gl.glDisable(GL10.GL_DITHER);
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glClearColor(.5f, .5f, .5f, 1);
    gl.glShadeModel(GL10.GL_SMOOTH);
    gl.glEnable(GL10.GL_DEPTH_TEST);
}

public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
    float ratio = (float) w / h;
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    gl.glFrustumf(-ratio, ratio, -1, 1, 0, 10);
}

public void onDrawFrame(GL10 gl) {
    gl.glDisable(GL10.GL_DITHER);
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    GLU.gluLookAt(gl, x, y, z, 0f, 0, 0f, 0f, 1f, 0f);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    if(displayCoordinateSystem) {
        drawCoordinateSystem(gl);
    }

    draw(gl);

//      gl.glFlush();
}

private void drawCoordinateSystem(GL10 gl) {
    ByteBuffer vbb = ByteBuffer.allocateDirect(6*3*4);
    vbb.order(ByteOrder.nativeOrder());
    FloatBuffer vertices = vbb.asFloatBuffer();

    ByteBuffer ibb = ByteBuffer.allocateDirect(6*2);
    ibb.order(ByteOrder.nativeOrder());
    ShortBuffer indexes = ibb.asShortBuffer();

    final float coordLength = 27f;

    //add point (-1, 0, 0)
    vertices.put(-coordLength);
    vertices.put(0);
    vertices.put(0);

    //add point (1, 0, 0)
    vertices.put(coordLength);
    vertices.put(0);
    vertices.put(0);

    //add point (0, -1, 0)
    vertices.put(0);
    vertices.put(-coordLength);
    vertices.put(0);

    //add point (0, 1, 0)
    vertices.put(0);
    vertices.put(coordLength);
    vertices.put(0);

    //add point (0, 0, -1)
    vertices.put(0);
    vertices.put(0);
    vertices.put(-coordLength);

    //add point (0, 0, 1)
    vertices.put(0);
    vertices.put(0);
    vertices.put(coordLength);

    for(int i = 0; i < 6; i++) {
        indexes.put((short)i);
    }

    vertices.position(0);
    indexes.position(0);

    gl.glColor4f(1, 1, 0, 0.5f);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertices);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);

    indexes.position(2);
    gl.glColor4f(0, 1, 0, 0.5f);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);

    indexes.position(4);
    gl.glColor4f(0, 0, 1, 0.5f);
    gl.glDrawElements(GL10.GL_LINES, 2, GL10.GL_UNSIGNED_SHORT, indexes);
}

protected abstract void draw(GL10 gl);
}