OpenGLEs并没有很好地为我的观点着色

时间:2017-01-20 12:40:55

标签: android opengl-es

我想给我的红色图上色。使用GL10绘制元素没有问题,但现在使用GLES20,图形为黑色而不是红色。

这里有我的代码: 设置颜色浮点数组和缓冲区:

for (int i=0;i<colors.length;i++)
        {
            colors[i]=1f;
            colors[++i]=0f;
            colors[++i]=0f;
            colors[++i]=1f;
        }
byteBuffer=ByteBuffer.allocateDirect(4*colors.length);
        byteBuffer.order(ByteOrder.nativeOrder());

        colors_buff=byteBuffer.asFloatBuffer();
        colors_buff.put(colors);
        colors_buff.position(0);

我的顶点和片段着色器:

 private String v_shader="" +
        "attribute vec4 verte;" +
        "attribute vec4 colors;" +
        "varying vec4 vcolor;" +
        "void main(){" +
        "gl_Position=verte;" +
        "vcolor=colors;" +
        "}";

private String c_shader="" +
        "precision mediump float;" +
        "varying vec4 vcolor;" +
        "void main(){" +
        "gl_FragColor=vcolor;" +
        "}";

我绘制元素的功能:

 public void DrawShader(){
        GLES20.glUseProgram(progra);

        int v_handler=GLES20.glGetAttribLocation(progra,"verte");
        int f_handler=GLES20.glGetUniformLocation(progra,"colors");

        GLES20.glEnableVertexAttribArray(v_handler);
        GLES20.glEnableVertexAttribArray(f_handler);

        GLES20.glVertexAttribPointer(v_handler,3,GLES20.GL_FLOAT,false,12,vertexbuffer);
        GLES20.glVertexAttribPointer(f_handler,4,GLES20.GL_FLOAT,false,16,colors_buff);

        GLES20.glDrawElements(GLES20.GL_LINES,indicies.length,GLES20.GL_UNSIGNED_SHORT,indicies_buff);

        GLES20.glDisableVertexAttribArray(v_handler);
        GLES20.glDisableVertexAttribArray(f_handler);
    }

另一个问题,如果我更改颜色数组并将其放入缓冲区,当我调用drw时,颜色不会改变,而当我使用GL10绘制它工作的元素时。  非常感谢所有人。

1 个答案:

答案 0 :(得分:0)

您正在混合uniformsattributes。决定哪一个。

在着色器中,您使用了attributeattribute vec4 colors;。要将其更改为制服,请将其移至片段着色器uniform vec4 uColor;

获取位置时,您将其视为uniformint f_handler=GLES20.glGetUniformLocation(progra,"colors");,将其更改为您应使用int f_handler=GLES20.glGetAttribLocation(progra,"colors");的属性。如果您将其用作统一,请删除启用以下内容的属性:GLES20.glEnableVertexAttribArray(f_handler);

您将指针指定为属性GLES20.glVertexAttribPointer(f_handler,4,GLES20.GL_FLOAT,false,16,colors_buff);以使用统一,您需要将其用作GLES20.glUniform4f(f_handler, 1.0f, .0f, .0f, 1.0f);,并且可以删除颜色缓冲区。

如何选择使用哪种方法应该查看两者的定义(uniformattribute)。但是为了在使用uniform时使其非常短,该值将被设置为整个绘制调用的常量。在您的情况下,这意味着您的形状将在整个表面上有一种颜色。每个顶点使用该属性,并且每个顶点将具有特定颜色,如果值不同,则顶点之间的像素将具有插值(渐变)。