2010-10-07 115 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); 
} 
} 

的三角形渲染器(大部分來自Apress Pro Android 2手冊)

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

應該如何? – 2010-10-07 17:04:56

1

它曾與

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

,但我不知道如何運用的透明度背後(因爲用相機另外一個surfaceview)

+0

好的,我使用gl.glClearColor(0f,0f,0f,0.0f); – 2010-10-08 11:18:49

0

我想添加評論,皮埃爾 - 安託萬的反應,但我還沒有適當的聲譽。

至於他提到的問題是,EGL顯示配置是錯誤的。

當我遇到這個問題,我跑進EGL顯示配置的問題是,通過CONFIGS列表迭代時,我選擇一個列表中的進一步下跌,比我應該有。

在我的特定示例(索尼Xperia X10的運行Android 2.3),我選擇了EGL的配置是有EGL_SAMPLES設爲4,EGL_SAMPLE_BUFFERS設置爲1。當我改變了我的配置代碼,選擇一個「早」配置INT他列出了EGL_SAMPLES設置爲1和EGL_SAMPLE_BUFFERS設置爲0,我的半黑色屏幕消失,我得到了適當的渲染。