我有一个使用OpenGL ES 2.0的Android应用程序。我需要从数组中绘制10条线,每条线均由起点和终点描述。因此,有10条线= 20点= 60个浮点值。没有点连接,因此数组中的每对点都与其他点无关,因此我使用GL_LINES进行绘制。

我通过将值放入浮点缓冲区并调用一些帮助程序代码来绘制它们,如下所示:

public void drawLines(FloatBuffer vertexBuffer, float lineWidth,
        int numPoints, float colour[]) {
    GLES20.glLineWidth(lineWidth);
    drawShape(vertexBuffer, GLES20.GL_LINES, numPoints, colour);
}

protected void drawShape(FloatBuffer vertexBuffer, int drawType,
        int numPoints, float colour[]) {
    // ... set shader ...
    GLES20.glDrawArrays(drawType, 0, numPoints);
}

drawLines接受float缓冲区(60个float),一个线宽,点数(20)和一个4个float颜色值数组。我没有显示着色器设置代码,但它基本上将color变量公开为统一的uColour值。

拾取uColour的 fragment 着色器只是将其直接插入输出中。
/* Fragment */
precision mediump float;

uniform vec4 uColour;
uniform float uTime;

void main() {
    gl_FragColor = uColour;
}

顶点着色器:
uniform mat4 uMVPMatrix;

attribute vec4 vPosition;

void main() {
    gl_Position = uMVPMatrix * vPosition;
}

但是现在我想做些不同的事情。我希望缓冲区中的每一行都有不同的颜色。颜色是线在阵列中的位置的函数。我想将白色的开始线,最后的深灰色以及两者之间的渐变之间的线阴影,例如#ffffff,#eeeeee,#dddddd等。

显然,我可以每次仅画一条线,每次都将一个新值插入uColour,但这效率低下。我不想一次调用GL并每次都在着色器中修改值,所以不希望调用GL 10次。

也许我可以在我的顶点着色器中声明一个统一的值uVertexCount?在绘制之前,我将uVertexCount设置为0,并且每次调用顶点着色器时,我都会增加该值。 fragment 着色器可以通过查看uVertexCount来确定行索引。然后,它可以在某个开始值和结束值之间或某些其他方式内插颜色值。但这取决于是否将每条线或点都视为图元,或者将整个线阵列视为一个图元。

这可行吗?我不知道每个 fragment 着色器调用顶点着色器多少次。调用是否以这种方式交错以使其可行,即顶点0,顶点1,x * fragment ,顶点2,顶点3,x * fragment 等。

有谁知道一些合理的示例代码,这些示例代码可能会证明这一概念,或使我指出采取其他类似方式进行操作?

最佳答案

将颜色信息添加到您的Vertexbuffer(Floatbuffer)中,并在着色器中使用该属性。

示例顶点缓冲区:

uniform mat4 uMVPMatrix;

attribute vec4 vPosition;
attribute vec3 vColor;

varying vec3 color;

void main() {
    gl_Position = uMVPMatrix * vPosition;
    color = vColor;
}

fragment fragment 处理程序示例:
precision mediump float;

varying vec3 color;

void main() {
    gl_FragColor = color;
}

10-08 08:23
查看更多