首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >安卓OpenGL Es 3.0创建圈

安卓OpenGL Es 3.0创建圈
EN

Stack Overflow用户
提问于 2016-02-16 16:20:37
回答 1查看 2K关注 0票数 2

我已经尝试实现了其他帖子中的建议,例如:

以及许多其他堆栈OverFlow,但没有一个是工作的。

要么我调用

代码语言:javascript
复制
draw()

方法,并且没有得到输出,或者代码已经过时,使用起来有点毫无意义。

我正在尝试创建一个基本的圆圈。我可以很好地创建三角形和正方形,但是我不知道如何正确地创建一个圆。

根据我目前的知识,只要添加更多的顶点就可以创建一个圆,如下图所示。然而,我不知道如何实现这一点。

这是我当前的SurfaceView渲染器:

代码语言:javascript
复制
public class MyGLRenderer implements GLSurfaceView.Renderer {
//Project Matrix
private float mMatrix[] = new float[16];
private Circle mCircle;
private Triangle mTriangle;

// Called once to set up the view's opengl es environment
public void onSurfaceCreated(GL10 unused, EGLConfig config){

    //Set the background frame color
    GLES30.glClearColor(1.0f,1.0f,1.0f,1.0f);

    mTriangle = new Triangle();
    mCircle = new Circle();
}

// Called for each redraw of the view
public void onDrawFrame(GL10 gl){
    //gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    //Redraw background color
    //GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT);


    //mTriangle.draw();

   Matrix.orthoM(mMatrix, 0, -1, 1, -1, 1, -1, 1);
   mCircle.draw(mMatrix);
}

// Called if the geometry of the view changes (example is when the screen orientation changes from landscape to portrait
public void onSurfaceChanged(GL10 unused, int width, int height){
    // Called if the geometry of the viewport changes
    GLES30.glViewport(0, 0, width, height);
}

public static int loadShader(int type, String shaderCode){

    // create a vertex shader type (GLES30.GL_VERTEX_SHADER)
    // or a fragment shader type (GLES30.GL_FRAGMENT_SHADER)
    int shader = GLES30.glCreateShader(type);

    // add the source code to the shader and compile it
    GLES30.glShaderSource(shader, shaderCode);
    GLES30.glCompileShader(shader);

    return shader;
}

}

我的SurfaceView如下:

代码语言:javascript
复制
public class MyGLSurfaceView extends GLSurfaceView {

    private final MyGLRenderer mRenderer;

    public MyGLSurfaceView(Context context){
        super(context);

        //Create an OpenGl 3.0 context
        setEGLContextClientVersion(3);

        mRenderer = new MyGLRenderer();

        //Set the Renderer for drawing on the GLSurfaceView
        setRenderer(mRenderer);

        //Render the view only when there is a change in the drawing data
        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
    }

我目前的Circle实现如下:

代码语言:javascript
复制
 public class Circle {

    private  int mProgram, mPositionHandle, mColorHandle, mMVPMatrixHandle ;
    private FloatBuffer mVertexBuffer;
    private float vertices[] = new float[364 * 3];
    float color[] = { 0.63671875f, 0.76953125f, 0.22265625f, 1.0f };

    private final String vertexShaderCode =
            "uniform mat4 uMVPMatrix;" +
                    "attribute vec4 vPosition;" +
                    "void main() {" +
                    "  gl_Position = uMVPMatrix * vPosition;" +
                    "}";

    private final String fragmentShaderCode =
            "precision mediump float;" +
                    "uniform vec4 vColor;" +
                    "void main() {" +
                    "  gl_FragColor = vColor;" +
                    "}";

    Circle(){
        vertices[0] = 0;
        vertices[1] = 0;
        vertices[2] = 0;

        for(int i =1; i <364; i++){
            vertices[(i * 3)+ 0] = (float) (0.1 * Math.cos((3.14/180) * (float)i ));
            vertices[(i * 3)+ 1] = (float) (0.2 * Math.sin((3.14/180) * (float)i ));
            vertices[(i * 3)+ 2] = 0;
        }


        Log.v("Thread", "" + vertices[0] + "," + vertices[1] + "," + vertices[2]);
        ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(vertices.length * 4);
        vertexByteBuffer.order(ByteOrder.nativeOrder());
        mVertexBuffer = vertexByteBuffer.asFloatBuffer();
        mVertexBuffer.put(vertices);
        mVertexBuffer.position(0);
        int vertexShader = loadShader(GLES30.GL_VERTEX_SHADER, vertexShaderCode);
        int fragmentShader = loadShader(GLES30.GL_FRAGMENT_SHADER, fragmentShaderCode);

        mProgram = GLES30.glCreateProgram();             // create empty OpenGL ES Program
        GLES30.glAttachShader(mProgram, vertexShader);   // add the vertex shader to program
        GLES30.glAttachShader(mProgram, fragmentShader); // add the fragment shader to program
        GLES30.glLinkProgram(mProgram);

    }

    public static int loadShader(int type, String shaderCode){

        int shader = GLES30.glCreateShader(type);
        GLES30.glShaderSource(shader, shaderCode);
        GLES30.glCompileShader(shader);
        return shader;
    }


    public void draw (float[] mvpMatrix){

        GLES30.glUseProgram(mProgram);

        // get handle to vertex shader's vPosition member
        mPositionHandle = GLES30.glGetAttribLocation(mProgram, "vPosition");

        // Enable a handle to the triangle vertices
        GLES30.glEnableVertexAttribArray(mPositionHandle);

        // Prepare the triangle coordinate data
        GLES30.glVertexAttribPointer(mPositionHandle, 3,
                GLES30.GL_FLOAT, false,12
                ,mVertexBuffer);

        // get handle to fragment shader's vColor member
        mColorHandle = GLES30.glGetUniformLocation(mProgram, "vColor");



        // Set color for drawing the triangle
        GLES30.glUniform4fv(mColorHandle, 1, color, 0);

        mMVPMatrixHandle = GLES30.glGetUniformLocation(mProgram, "uMVPMatrix");

        // Apply the projection and view transformation
        GLES30.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);



        // Draw the triangle
        GLES30.glDrawArrays(GLES30.GL_TRIANGLE_FAN, 0, 364);

        // Disable vertex array
        GLES30.glDisableVertexAttribArray(mPositionHandle);

    }

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-16 18:08:45

  1. Use answer from https://stackoverflow.com/a/19558553/919150.
  2. Replace GLES20 to GLES30
  3. 在渲染器中声明投影矩阵为

私有浮点mMatrix[] =新的float16;

  • 初始化矩阵为

Matrix.orthoM(mMatrix,0,-1,1,-1,1,-1,1,1);

  • 画圆

mCircle.draw(mMatrix);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35427230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档