简体   繁体   English

在android中画一条线GLES 2.0

[英]Drawing a line in android open GLES 2.0

Hi I am new in android open gl. 嗨,我是android open gl的新手。 I tries to create few 2d objects in open gles 2.0. 我尝试在open gles 2.0中创建一些2d对象。 Now I tried to draw a line in android open gles 2.0. 现在我试图在android open gles 2.0中画一条线。 my code looks like 我的代码看起来像

public class UserLine
{
     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;" +
            "}";

        private final FloatBuffer vertexBuffer;
        private final ShortBuffer drawListBuffer;
        private final int mProgram;
        private int mPositionHandle;
        private int mColorHandle;
        private int mMVPMatrixHandle;

        static final int COORDS_PER_VERTEX = 3;
        private final int vertexStride = COORDS_PER_VERTEX * 4;

        private float[] pathCords = 
            {
            0.00f, 0.0f, 0.0f,

            0.5f, 0.3f, 0.0f
            };
        private short[] pathDrawOrder = {0,1}
        private float[] color = {1.0f, 0.0f, 0.0f, 1.0f};
    public UserLine()
    {
        ByteBuffer bb = ByteBuffer.allocateDirect(pathCords.length * 4);
        bb.order(ByteOrder.nativeOrder());
        vertexBuffer = bb.asFloatBuffer();
        vertexBuffer.put(pathCords);
        vertexBuffer.position(0);

        ByteBuffer dlb = ByteBuffer.allocateDirect(pathDrawOrder.length * 2);
        dlb.order(ByteOrder.nativeOrder());
        drawListBuffer = dlb.asShortBuffer();
        drawListBuffer.put(pathDrawOrder);
        drawListBuffer.position(0);

        int vertexShader = MyGLRenderer.loadShader(GLES20.GL_VERTEX_SHADER,vertexShaderCode);
        int fragmentShader = MyGLRenderer.loadShader(GLES20.GL_FRAGMENT_SHADER,fragmentShaderCode);

        mProgram = GLES20.glCreateProgram();             
        GLES20.glAttachShader(mProgram, vertexShader);   
        GLES20.glAttachShader(mProgram, fragmentShader); 
        GLES20.glLinkProgram(mProgram); 
    }

    public void draw(float[] mvpMatrix) {

    GLES20.glUseProgram(mProgram);
    mPositionHandle = GLES20.glGetAttribLocation(mProgram, "vPosition");
    GLES20.glEnableVertexAttribArray(mPositionHandle);
    GLES20.glVertexAttribPointer(mPositionHandle, COORDS_PER_VERTEX,GLES20.GL_FLOAT, false,
            vertexStride, vertexBuffer);

    mColorHandle = GLES20.glGetUniformLocation(mProgram, "vColor");
    GLES20.glUniform4fv(mColorHandle, 1, color, 0);
    mMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix");
    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glDrawElements(GLES20.GL_LINES, color.length,
            GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

    GLES20.glDisableVertexAttribArray(mPositionHandle);
    GLES20.glDisable(mColorHandle);
    }
}

SO here is my problem According to this code it must draw one line but along that line it also draw one extra line which is not expected behavior. 所以这是我的问题,根据此代码,它必须画一条线,但沿着这条线,它也画一条多余的线,这不是预期的行为。 在此处输入图片说明

Am I doing some thing wrong or it that default behavior. 我是在做错什么还是默认行为? Need Help. 需要帮忙。 Thank you. 谢谢。

I think the problem is here: 我认为问题出在这里:

GLES20.glDrawElements(GLES20.GL_LINES, color.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

The second parameter is the count and I don't understand why you have it set to the length of color. 第二个参数是计数,我不明白为什么要将它设置为颜色的长度。 That's just the color of the line you pass into the shader so the length is always 4: 那只是您传递到着色器中的线条的颜色,因此长度始终为4:

private float[] color = {1.0f, 0.0f, 0.0f, 1.0f};

You are drawing a line with 2 points, as specified in pathDrawOrder, so I think using the length of that instead is what you need: 您正在按照pathDrawOrder中的指定绘制一条包含2个点的线,因此我认为使用长度是您需要的:

GLES20.glDrawElements(GLES20.GL_LINES, pathDrawOrder.length, GLES20.GL_UNSIGNED_SHORT, drawListBuffer);

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

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