Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法让opengl ES在Android上以2D绘制任何内容_Android_Opengl Es_2d - Fatal编程技术网

无法让opengl ES在Android上以2D绘制任何内容

无法让opengl ES在Android上以2D绘制任何内容,android,opengl-es,2d,Android,Opengl Es,2d,这是我写的代码,目的是让2D绘图正常工作。活动、视图和渲染器的设置方式正确。我有一个完全黑色的屏幕,但没有多边形。没有画任何东西。这会让我发疯的 public class OpenGLActivity extends Activity { private GLSurfaceView surfaceView; /** Called when the activity is first created. */ @Override public void onCre

这是我写的代码,目的是让2D绘图正常工作。活动、视图和渲染器的设置方式正确。我有一个完全黑色的屏幕,但没有多边形。没有画任何东西。这会让我发疯的

public class OpenGLActivity extends Activity {

    private GLSurfaceView surfaceView;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(
                WindowManager.LayoutParams.FLAG_FULLSCREEN, 
                WindowManager.LayoutParams.FLAG_FULLSCREEN
                );

        this.surfaceView = new OpenGLSurfaceView(this);
        setContentView(this.surfaceView);
    }

    @Override
    protected void onPause() {
        super.onPause();
        surfaceView.onPause();
    }

    @Override
    protected void onResume() {
        super.onResume();
        surfaceView.onResume();
    }
}

public class OpenGLSurfaceView extends GLSurfaceView {

    private OpenGLSurfaceRenderer renderer;

    public OpenGLSurfaceView(Context context) {
        super(context);
        this.renderer = new OpenGLSurfaceRenderer();
        setRenderer(renderer);
    }

}

public class OpenGLSurfaceRenderer implements Renderer {

    private FloatBuffer vertexBuffer;
    private float[] vertices = {
            0.0f, 1.0f, 0.0f,
            0.0f, 0.0f, 0.0f,
            1.0f, 1.0f, 0.0f,
            1.0f, 0.0f, 0.0f,
            0.0f, 10.0f, 0.0f,
            0.0f, 0.0f, 0.0f,
            10.0f, 10.0f, 0.0f,
            10.0f, 0.0f, 0.0f
    };

    public OpenGLSurfaceRenderer() {
        ByteBuffer byteBuffer = ByteBuffer.allocateDirect(vertices.length * (Float.SIZE >> 3));
        vertexBuffer = byteBuffer.asFloatBuffer();
        vertexBuffer.put(vertices);
        vertexBuffer.position(0);
    }

    public void onSurfaceCreated(GL10 gl, EGLConfig config) {

        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);

        gl.glClearColor(0.0f, 0.0f, 0.0f, 1);
        gl.glShadeModel(GL10.GL_FLAT);
        gl.glDisable(GL10.GL_DEPTH_TEST);
        gl.glEnable(GL10.GL_TEXTURE_2D);

        gl.glDisable(GL10.GL_DITHER);
        gl.glDisable(GL10.GL_LIGHTING);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    }

    public void onDrawFrame(GL10 gl) {

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
        gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

        gl.glTranslatef(0.0f, 0.0f, 0.5f);
        gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    }

    public void onSurfaceChanged(GL10 gl, int width, int height) {

        gl.glViewport(0, 0, width, height);

        // Clear the projection matrix
        gl.glMatrixMode(GL10.GL_PROJECTION);
        gl.glLoadIdentity();

        // Set up orthographic projection mode (2D drawing)
        gl.glOrthof(0, width, height, 0, 0, 1);

        gl.glMatrixMode(GL10.GL_MODELVIEW);
        gl.glLoadIdentity();
    }

}
我看到四个问题:

  • glDrawArrays()的最后一个参数应该是8,而不是4。这是您提供的顶点数,而不是三角形条中的三角形数

  • 正交投影使世界单位等同于像素。前4个顶点描述1像素宽的三角形。也许在屏幕的左下角有一个白色像素

  • 每帧沿Z轴推进模型投影。两帧后,它将脱离视锥

  • 最重要的是,您没有在ByteBuffer上设置正确的顺序。将此行插入OpenGlRenderer()构造函数:

    公共OpenGLSurfaceRenderer(){ ByteBuffer ByteBuffer=ByteBuffer.allocateDirect(顶点.length*4);
    byteBuffer.order(ByteOrder.nativeOrder());您的活动代码在哪里?…实例化一个GLSURFACHEVIEW并将其渲染器设置为OpenGLSURFACHERENDERER,添加了我的活动和视图代码。我有8个顶点的原因是,我试图创建一个1x1的矩形和另一个10x10像素宽的矩形。我将它们添加到同一个vertexBuffer以便能够在两者之间切换n然后很容易。我也尝试过画一个100x100,我使用了负坐标值,但仍然没有结果。如果我更改了gl.glClearColor,我的屏幕上会出现另一种颜色,所以OpenGL似乎做了些什么。我看到你启用了纹理,但没有做任何纹理。建议删除gl.glEnable(GL10.gl\u TEXTURE\u 2D);或将其更改为glDisable。哦,看,您还将沿Z方向每帧前进0.5个单位。因此,在两帧之后,您将根本看不到任何内容。尝试注释gl.glTranslatef(0.0f,0.0f,0.5f),但没有运气,我还认为转换矩阵没有应用于顶点缓冲区内存,而是仅由openGL应用“引擎盖下”。