2010-10-07 112 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,我的半黑色屏幕消失,我得到了适当的渲染。