2010-10-07 2 views
1

меня следовать примеру OPENGL приложения, и я не знаю, почему это происходит, что ...Android OpenGL визуализирует только половину экрана

У меня есть GLSurfaceView с это соответствующим визуализатором рисунком треугольника. Но вместо того, чтобы отображать весь экран на экране, у меня есть только верхняя половина, и он также дублируется, как вы можете видеть на картинке. Я использую Nexus One alt text

XML-:

<?xml version="1.0" encoding="utf-8"?> 
<com.forgottenprojects.geoturista.DrawingLayer 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/drawing" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
/> 

Активность имеет это в манифесте:

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 

DrawingLayer класса:

public class DrawingLayer extends GLSurfaceView { 
private TriangleRenderer renderer; 
private Context context; 
public DrawingLayer(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    init(context); 
} 
public DrawingLayer(Context context) { 
    super(context); 
    init(context); 
} 
private void init(Context c) 
{ 
    this.context = c; 
    setEGLConfigChooser(false); 
    this.renderer = new TriangleRenderer(c); 
    setRenderer(renderer); 
    setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); 
    getHolder().setFormat(PixelFormat.TRANSLUCENT); 
} 
} 

triangle renderer (большая часть из Apress Pro Android 2 book)

public class TriangleRenderer implements Renderer { 
private final static int VERTS = 3; 
private FloatBuffer mFVertexBuffer; 
private ShortBuffer mIndexBuffer; 

    TriangleRenderer(Context context) 
    { 
     ByteBuffer vbb = ByteBuffer.allocateDirect(VERTS * 3 * 4); 
     vbb.order(ByteOrder.nativeOrder()); 
     mFVertexBuffer = vbb.asFloatBuffer(); 
     ByteBuffer ibb = ByteBuffer.allocateDirect(VERTS * 2); 
     ibb.order(ByteOrder.nativeOrder()); 
     mIndexBuffer = ibb.asShortBuffer(); 
     float[] coords = { 
     -0.5f, -0.5f, 0, // (x1,y1,z1) 
     0.5f, -0.5f, 0, 
     0.0f, 0.5f, 0 
     }; 
     for (int i = 0; i < VERTS; i++) { 
      for(int j = 0; j < 3; j++) { 
       mFVertexBuffer.put(coords[i*3+j]); 
      } 
     } 
     short[] myIndecesArray = {0,1,2}; 
     for (int i=0;i<3;i++) 
     { 
      mIndexBuffer.put(myIndecesArray[i]); 
     } 
     mFVertexBuffer.position(0); 
     mIndexBuffer.position(0); 
    } 
    protected void draw(GL10 gl) 
    { 
     gl.glColor4f(1.0f, 0, 0, 0.5f); 
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer); 
     gl.glDrawElements(GL10.GL_TRIANGLES, VERTS, 
     GL10.GL_UNSIGNED_SHORT, mIndexBuffer); 
    } 
@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST); 
    gl.glClearColor(0.5f, 0.5f, 0.5f, 1.0f); 
    gl.glShadeModel(GL10.GL_SMOOTH); 
    gl.glEnable(GL10.GL_DEPTH_TEST); 
} 
@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glDisable(GL10.GL_DITHER); 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); 
    gl.glClearColor(1.0f, 0.5f, 0.7f, 1.0f); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    GLU.gluLookAt(gl, 0, 0, -5, 0f, 0f, 0f, 0f, 1f, 0f); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    draw(gl); 
} 
@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    gl.glViewport(0, 0, width, height); 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    float ratio = (float)width/(float)height; 
    gl.glLoadIdentity(); 
    gl.glFrustumf(-ratio, ratio, -1, 1, 3, 7); 
} 
} 

Заранее благодарен!

ответ

0

Похоже, что ваша конфигурация дисплея EGL неверна.

+0

Как это должно быть? –

1

Он работал с

setEGLConfigChooser(8,8,8,8,4,4); 

, но я не знаю, как применить прозрачность позади него (потому что есть еще одна SurfaceView с видом камеры)

+0

Хорошо, я сделал это с помощью gl.glClearColor (0f, 0f, 0f, 0.0f); –

0

Я хотел бы добавить комментарий Пьер-Антуан ответ, но у меня пока нет надлежащего уровня репутации.

Как он упоминает, проблема в том, что конфигурация дисплея EGL неверна.

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

В моем конкретном примере (Sony Xperia X10 работает под управлением Android 2.3) я выбрал конфигурацию EGL, для которой EGL_SAMPLES установлено в 4 и EGL_SAMPLE_BUFFERS, установленное в 1. Когда я изменил свой код конфигурации, чтобы выбрать «более раннюю» конфигурацию int он перечисляет с EGL_SAMPLES установленным в 1 и EGL_SAMPLE_BUFFERS установленным в 0, мой получерный экран ушел, и я получил правильный рендер.