在y轴上移动的简单圆

时间:2016-12-23 09:12:15

标签: android opengl-es geometry

我试图制作一个三角形和圆形的程序,其中三角形应该是透明的,并且圆圈需要在y轴上移动。我可以制作圆形和三角形,但不知道如何移动圆形。所以我做了一个正方形并将其设置在y轴上移动。我的问题是用移动制作圆圈的最佳方法是什么,我考虑将纹理添加到方形看起来像圆形,但它也会将纹理应用于三角形。任何帮助都意味着很多。谢谢!

这是我的代码:

public class MyGLRender implements GLSurfaceView.Renderer{
    Context con;
    private float[] mModelMatrix = new float[16]; 

private float[] mViewMatrix = new float[16]; 

private float[] projectionMatrix = new float[16];

private float[] mVPMatrix = new float[16]; 





private final FloatBuffer squareVert;
private final FloatBuffer mColor;
private FloatBuffer triangleVert;
private final FloatBuffer tColor;

private int mvpMatrixHandle;


private int positionHandle;


private int colorHandle;




ShortBuffer indexBuffer = null;

short[] indeces={
        0,1,2,
        0,3,2

};

float i;
public int smer;

public MyGLRender(Context con)
{
    this.con=con;
    i=0;
    smer=1;




    final float[] square={
            0.0f, 1.0f, 0.0f,
            0.0f,0.0f,0.0f,
            1.0f,0.0f,0.0f,
            1.0f,1.0f,0.0f,


    };

    final float[] triangle={
            0.0f,  0.5f, 0.0f,
            -0.5f, -0.5f, 0.0f,
            0.5f, -0.5f, 0.0f
    };


    final float[] colors = {1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1
    };

    final float[] colorsTr = {1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1,
            1,1,1

    };

    squareVert = ByteBuffer.allocateDirect(square.length * 4)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();

    squareVert.put(square).position(0);
    indexBuffer = ByteBuffer.allocateDirect(indeces.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
    indexBuffer.put(indeces).position(0);

    mColor = ByteBuffer.allocateDirect(colors.length * 4)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    mColor.put(colors).position(0);


    triangleVert = ByteBuffer.allocateDirect(square.length * 4)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();

    triangleVert.put(triangle).position(0);
    indexBuffer = ByteBuffer.allocateDirect(indeces.length * 2).order(ByteOrder.nativeOrder()).asShortBuffer();
    indexBuffer.put(indeces).position(0);

    tColor = ByteBuffer.allocateDirect(colors.length * 4)
            .order(ByteOrder.nativeOrder()).asFloatBuffer();
    tColor.put(colorsTr).position(0);
}

@Override
public void onSurfaceCreated(GL10 glUnused, EGLConfig config)
{

    GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);


    Matrix.setLookAtM(mViewMatrix, 0, 0, 0, -5, 0, 0, 0, 0, 1, 0);


    final String vertexShader =
            "uniform mat4 un_MVPMatrix;      \n"
                    + "attribute vec4 attribute_Position;     \n"
                    + "attribute vec4 attribute_Color;        \n"

                    + "varying vec4 var_Color;            \n"



                    + "void main()                        \n"
                    + "{                                  \n"
                    + "   var_Color = attribute_Color;          \n"


                    + "   gl_Position = un_MVPMatrix      \n"
                    + "               * attribute_Position;   \n"

                    + "}                                 \n";



    final String fragmentShader =
            "precision mediump float;       \n"

                    + "varying vec4 var_Color;          \n"



                    + "void main()                    \n"
                    + "{                              \n"

                     +
                    "      gl_FragColor = (length(gl_FragCoord.xy) < 0.5 ) \n" +
                    "          ? vec4(1.0, 1.0, 1.0, 1.0)\n" +
                    "          : vec4(0.5, 0.5, 0.5, 0.5);   \n"

                    + "}                              \n";


    int vertexS = GLES20.glCreateShader(GLES20.GL_VERTEX_SHADER);

    if (vertexS != 0)
    {

        GLES20.glShaderSource(vertexS, vertexShader);


        GLES20.glCompileShader(vertexS);


        final int[] compile_Status = new int[1];
        GLES20.glGetShaderiv(vertexS, GLES20.GL_COMPILE_STATUS, compile_Status, 0);


    }


    if (vertexS == 0)
    {
        try {
            throw new Exception("Vertex shader is not created.");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    int fragmentS = GLES20.glCreateShader(GLES20.GL_FRAGMENT_SHADER);
    if (fragmentS != 0)
    {

        GLES20.glShaderSource(fragmentS, fragmentShader);


        GLES20.glCompileShader(fragmentS);


        final int[] compileStatus = new int[1];
        GLES20.glGetShaderiv(fragmentS, GLES20.GL_COMPILE_STATUS, compileStatus, 0);


    }


    if (fragmentS == 0)
    {
        try {
            throw new Exception("Fragment shader is not created.");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    int program = GLES20.glCreateProgram();

    if (program != 0)
    {

        GLES20.glAttachShader(program, vertexS);


        GLES20.glAttachShader(program, fragmentS);


        GLES20.glBindAttribLocation(program, 0, "attribute_Position");
        GLES20.glBindAttribLocation(program, 1, "attribute_Color");


        GLES20.glLinkProgram(program);


        final int[] linkStatus = new int[1];
        GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0);

    }

    if (program == 0)
    {
        try {
            throw new Exception("Program error");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }


    mvpMatrixHandle = GLES20.glGetUniformLocation(program, "un_MVPMatrix");
    positionHandle = GLES20.glGetAttribLocation(program, "attribute_Position");
    colorHandle = GLES20.glGetAttribLocation(program, "attribute_Color");


    GLES20.glUseProgram(program);
}


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

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



    final float ratio = (float) width / height;
    final float left = -ratio;
    final float right = ratio;
    final float bottom = -1.0f;
    final float top = 1.0f;
    final float near = 1.0f;
    final float far = 10.0f;


    Matrix.frustumM(projectionMatrix, 0, left, right, bottom, top, near, far);

}
@Override
public void onDrawFrame(GL10 glUnused) {
    GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);

    if (i > 1) {
        smer = -1;
    }
    if (i < -1) {
        smer = 1;

    }
    i += 0.05 * smer;

    Matrix.setIdentityM(mModelMatrix, 0);
    Matrix.translateM(mModelMatrix, 0, 0, i, 0.0f);

    drawSqare(squareVert, indexBuffer);

    Matrix.setIdentityM(mModelMatrix, 0);


    Matrix.translateM(mModelMatrix,0,  -1.5f, 0.0f, 0.0f);
    drawSTriangle(triangleVert, indexBuffer);

    GLES20.glDisable(GLES20.GL_CULL_FACE);


    GLES20.glDisable(GLES20.GL_DEPTH_TEST);



    GLES20.glEnable(GLES20.GL_BLEND);


    GLES20.glBlendFunc(GLES20.GL_ONE, GLES20.GL_ONE);


    Matrix.setIdentityM(mModelMatrix, 0);


    Matrix.translateM(mModelMatrix, 0, -1.0f, 0.0f, -0.0f);


    drawSTriangle(triangleVert, indexBuffer);


    GLES20.glDisable(GLES20.GL_BLEND);

}


private void drawSqare(final FloatBuffer aTriangleBuffer,ShortBuffer sb)
{


    aTriangleBuffer.position(0);
    GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, aTriangleBuffer);

    GLES20.glEnableVertexAttribArray(positionHandle);


    mColor.position(0);
    GLES20.glVertexAttribPointer(colorHandle, 3, GLES20.GL_FLOAT, false, 0, mColor);

    GLES20.glEnableVertexAttribArray(colorHandle);


    Matrix.multiplyMM(mVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);


    Matrix.multiplyMM(mVPMatrix, 0, projectionMatrix, 0, mVPMatrix, 0);

    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mVPMatrix, 0);

    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indeces.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer);

}

private void drawSTriangle(final FloatBuffer fbb,ShortBuffer sbb)
{


    fbb.position(0);


    GLES20.glVertexAttribPointer(0, 3, GLES20.GL_FLOAT, false, 0, fbb);
    GLES20.glEnableVertexAttribArray(positionHandle);


    tColor.position(0);
    GLES20.glVertexAttribPointer(colorHandle, 3, GLES20.GL_FLOAT, false,
            0, tColor);

    GLES20.glEnableVertexAttribArray(colorHandle);



    Matrix.multiplyMM(mVPMatrix, 0, mViewMatrix, 0, mModelMatrix, 0);



    Matrix.multiplyMM(mVPMatrix, 0, projectionMatrix, 0, mVPMatrix, 0);

    GLES20.glUniformMatrix4fv(mvpMatrixHandle, 1, false, mVPMatrix, 0);
    GLES20.glDrawElements(GLES20.GL_TRIANGLES, indeces.length, GLES20.GL_UNSIGNED_SHORT, indexBuffer);
}

}

1 个答案:

答案 0 :(得分:0)

您可以按照Android提供的文档进行 OpenGL

选中adding Rotation or motion to view.

这是来自Android http://developer.android.com/shareables/training/OpenGLES.zip

的示例