java - 如何使用着色器为使用 GL_LINES 和 OpenGL ES 2.0 绘制的线条着色

标签 java android opengl-es-2.0

我有一个使用 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 采用浮点缓冲区(60 个 float )、线宽、点数 (20) 和一个 4 float 颜色值数组。我没有显示着色器设置代码,但它基本上将颜色变量暴露给统一的 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 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 着色器:

precision mediump float;

varying vec3 color;

void main() {
    gl_FragColor = color;
}

关于java - 如何使用着色器为使用 GL_LINES 和 OpenGL ES 2.0 绘制的线条着色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10720137/

相关文章:

java - 如何获取客户端域名信息?

java - Spring 启动 : custom properties configuration and tests

java - 无法弹回输入 firebase

android - 从 HOME 按钮按下返回后未调用 onLoadFinished

ios - Xcode 中的帧捕获失败

android - OpenGL ES 2.0如何在体素世界中提高性能?

javascript - xml2json jQuery 插件不起作用

java - 如何在具有自定义标签的 xml 中添加新行?

java - 使用 Vuforia 的 Java API 未检测到目标时隐藏 UI 元素

java - 池化 HttpClientConnectionManager : How to do Https requests?