简体   繁体   English

在GLSurfaceView上绘制2D

[英]Drawing 2D on a GLSurfaceView

I am attempting to draw a 2D square on a GLSurfaceView in 2D mode. 我试图以2D模式在GLSurfaceView上绘制2D正方形。 I can draw the object in 3D mode and have tested that the square is out in 3D space. 我可以在3D模式下绘制对象,并测试正方形是否在3D空间中。 I then try to configure the matrix for 2d drawing and when I attempt to draw my object nothing appears. 然后,我尝试为2D绘图配置矩阵,当我尝试绘制对象时,什么也没有出现。

My GLSurfaceView instance implements GLSurfaceView.Renderer. 我的GLSurfaceView实例实现了GLSurfaceView.Renderer。

I've broken the setup into two functions: 我将设置分为两个功能:

private void prepare3Ddrawing(GL10 gl)
{
    gl.glLoadIdentity();
    gl.glViewport(0, 0, getWidth(), getHeight());
    gl.glDisable(GL10.GL_DITHER);
    gl.glEnable(GL10.GL_DEPTH_TEST);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluPerspective(gl, 45.0f, (float)getWidth()/(float)getHeight(),0.1f,100.0f);    
}
private void prepare2Ddrawing(GL10 gl)
{
    gl.glDisable(GL10.GL_CULL_FACE);
    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glMatrixMode(GL10.GL_PROJECTION);
    gl.glLoadIdentity();
    GLU.gluOrtho2D(gl,0,getWidth(), 0, getHeight());
    gl.glScalef(1, -1, 1);
    gl.glTranslatef(0, -getHeight(), 0);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
}

And here is my draw method... 这是我的绘画方法...

public void onDrawFrame(GL10 gl)
{
    gl.glClear(GL10.GL_DEPTH_BUFFER_BIT|GL10.GL_COLOR_BUFFER_BIT);  
    prepare3Ddrawing(gl);

    camera.draw(gl);
    go2d.draw(gl);

    prepare2Ddrawing(gl);
    go2d.draw(gl);

}

and finally, my go2d object is an instance of an object I created called GameObject2d. 最后,我的go2d对象是我创建的名为GameObject2d的对象的实例。 It's draw method looks like this... 它的绘制方法看起来像这样...

@Override
public void draw(GL10 gl)
{
    super.draw(gl);

    gl.glEnable(GL10.GL_TEXTURE_2D);
    gl.glEnable(GL10.GL_ALPHA_TEST);
    gl.glAlphaFunc(GL10.GL_GREATER, 0.0f);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glTexCoordPointer(2,GL10.GL_FLOAT,0,textureBuffer);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);

    gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
    gl.glEnable(GL10.GL_BLEND);


    gl.glFrontFace(GL10.GL_CW);
    //gl.glEnable(GL10.GL_CULL_FACE);
    gl.glCullFace(GL10.GL_BACK);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

    gl.glDrawElements(GL10.GL_TRIANGLES, 6, GL10.GL_UNSIGNED_SHORT, indexBuffer);
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
    gl.glDisable(GL10.GL_ALPHA_TEST);
    gl.glDisable(GL10.GL_TEXTURE_2D);   
}

Does anyone have any ideas? 有人有什么想法吗? Again, I am still able to see the 3D rendered version of the go2D object, but I do not see the 2D version. 同样,我仍然可以看到go2D对象的3D渲染版本,但是看不到2D版本。

Thanks. 谢谢。

As you don't include any data, I can only propose two methods to debug the issue. 由于您不包含任何数据,因此我只能提出两种方法来调试问题。

Step 1: try to force your 2d - perspective matrix and modelview matrix to be Identity Matrices. 第1步:尝试将您的2D-透视矩阵和Modelview矩阵设置为恒等矩阵。 Then if you force your Square data vertices inside the clip space (eg x,y = +-1 or x,y= +-0.75, z=0, you should see a square appearing in the screen. 然后,如果将Square数据顶点强制置于剪辑空间内(例如x,y = + -1或x,y = + -0.75,z = 0),则应该在屏幕上看到一个正方形。

Step 2: now that the data model is correct, check what your model view and perspective matrices do: multiply each of your square vertices (x,y,z, w=1) with ModelView Matrix * CameraMatrix * PerspectiveMatrix. 步骤2:既然数据模型正确,请检查模型视图和透视矩阵的作用:将每个正方形顶点(x,y,z,w = 1)乘以ModelView Matrix * CameraMatrix * PerspectiveMatrix。 What do you get? 你得到了什么? Are the x,y,z much outside |w| x,y,z在| w |之外吗? ?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM