我想给我的红色图上色。使用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绘制它工作的元素时。 非常感谢所有人。
答案 0 :(得分:0)
您正在混合uniforms
和attributes
。决定哪一个。
在着色器中,您使用了attribute
:attribute vec4 colors;
。要将其更改为制服,请将其移至片段着色器uniform vec4 uColor;
。
获取位置时,您将其视为uniform
:int 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);
,并且可以删除颜色缓冲区。
如何选择使用哪种方法应该查看两者的定义(uniform
和attribute
)。但是为了在使用uniform时使其非常短,该值将被设置为整个绘制调用的常量。在您的情况下,这意味着您的形状将在整个表面上有一种颜色。每个顶点使用该属性,并且每个顶点将具有特定颜色,如果值不同,则顶点之间的像素将具有插值(渐变)。