2011-12-31 59 views
2

下面的代码试图绘制GLSurfaceView的框架和一个对角线但结果是一个大的黑色的屏幕来代替。我尝试设置正交投影,将视口大小与视图大小对齐,使用glDrawArrays()绘制框线,并使用glDrawElements()绘制对角线。我找不到问题的根源。画线用OpenGL ES 1.0

public class MapView extends GLSurfaceView implements Renderer { 

private int w, h; 

private FloatBuffer frameVertices; 

private ByteBuffer diagIndices; 

public MapView(Context ctx) { this(ctx, null); } 

public MapView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    setRenderer(this); 
} 

@Override 
public void onDrawFrame(GL10 gl) { 
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT); 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 
    gl.glVertexPointer(2, GL10.GL_FLOAT, 0, frameVertices); 
    gl.glColor4f(0f, 0f, 1f, 0.5f); 
    gl.glDrawArrays(GL10.GL_LINE_LOOP, 0, 4); 
    gl.glDrawElements(GL10.GL_LINES, 1, GL10.GL_UNSIGNED_BYTE, diagIndices); 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
} 

@Override 
public void onSurfaceChanged(GL10 gl, int width, int height) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onSurfaceCreated(GL10 gl, EGLConfig config) { 
    w = getWidth(); h = getHeight(); 
    TRC.debug("w = " + w + ", h = " + h); 
    gl.glClearColor(0, 0, 0, 1); 
    gl.glViewport(0, 0, w, h); 
    gl.glDepthRangex(1, -1); // TODO remove 
    gl.glMatrixMode(GL10.GL_PROJECTION); 
    gl.glLoadIdentity(); 
    gl.glOrthox(0, w, 0, h, 1, -1); 

    float[] frame = { 
     0, 0, 
     w-1, 0, 
     w-1, h-1, 
     0, h-1 }; 
    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(frame.length * 4); 
    byteBuffer.order(ByteOrder.nativeOrder()); 
    frameVertices = byteBuffer.asFloatBuffer(); 
    frameVertices.put(frame); 
    frameVertices.flip(); 
    frameVertices.position(0); 
    gl.glLineWidthx(10); 
    gl.glMatrixMode(GL10.GL_MODELVIEW); 
    gl.glLoadIdentity(); 
    gl.glDisable(GL10.GL_DEPTH_TEST); 
    diagIndices = ByteBuffer.allocateDirect(2); 
    diagIndices.order(ByteOrder.nativeOrder()); 
    diagIndices.put(new byte[] {0, 2}); 
    diagIndices.flip(); 
} 

} 

什么可以回事?

回答

0

您不需要gl.glDepthRangex()方法调用,并且您的近和远剪切平面在gl.glOrthox()之间切换。除此之外,我没有看到任何错误。尝试使用gl.glClearColor()设置不同的清晰颜色,但我认为它没有太大的区别。

关于第二个想法,近剪裁面可能会更好为0,试试这个:gl.glOrthox(0, w, 0, h, 0, 1);

+0

嗨,谢谢你看看它。我尝试了不同的清晰颜色,并有效果。我将裁剪平面改为0,1,并没有注意到任何区别。整个视角充满了清晰的颜色(好,至少我知道部分GL正在工作)。 – Endre 2011-12-31 09:43:45

+0

首先尝试将顶点更改为朝向屏幕中间的随机点。如果你没有看到任何东西,请尝试使用'int error = gl.glGetError(); if(error!= GL10.GL_NO_ERROR){Log.e(error); }'在绘制方法结束时查看是否存在OpenGL抛出的特定错误。你的错误将是一个整数,你可以查看[这里](http://developer.android.com/reference/javax/microedition/khronos/opengles/GL10.html)的含义和错误代码的解释[here ](http://www.opengl.org/wiki/GL_Error_Codes)。评论这里的错误,我会进一步研究它。 – 2011-12-31 09:53:16

+0

在onDrawFrame()方法中的每次GL调用之后,glGetError()返回0。现在我所尝试的是在下载示例源文件中将基于透视的投影转换为正交。修改后的示例正在运行,虽然我的应用程序没有,我仍然无法弄清楚这两个应用程序之间有什么棘手的区别。 – Endre 2012-01-01 17:07:27

2

我想通了这个问题。我用glOrthox(),我以为x只是表示整数值。但这并不完全是这样,中间是一个二叉点。 16bit.16bit。我的顶点超出了屏幕范围......我的解决方案是将glOrthox()更改为glOrthof()。谢谢您的帮助!