OpenGLES2.0を使用しているAndroidアプリがあります。それぞれが始点と終点で記述されている配列から10本の線を引く必要があります。したがって、10行=20ポイント=60フロート値があります。どのポイントも接続されていないため、配列内のポイントの各ペアは他のポイントとは無関係であるため、GL_LINESを使用して描画します。
値をfloatバッファーに入れ、次のようなヘルパーコードを呼び出すことで、それらを描画します。
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)、および4floatカラー値配列を取ります。シェーダー設定コードは示していませんが、基本的にカラー変数を均一なuColour値に公開します。
uColourを取得するフラグメントシェーダーは、出力に直接接続するだけです。
/* 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;
}
でも今は違うことをしたいです。バッファ内のすべての行の色を変えたいです。色は、配列内の線の位置の関数です。最初の線を白、最後の濃い灰色、および2つの間のグラデーションの間の線(たとえば、#ffffff、#eeeeee、#ddddddなど)をシェーディングしたいと思います。
明らかに、各線を個別に描画して、毎回新しい値をuColourにプラグインすることもできますが、それは非効率的です。GLを1回呼び出して、毎回シェーダーで値を変更できるのに、GLを10回呼び出したくありません。
おそらく、頂点シェーダーでuVertexCountという均一な値を宣言できますか?描画の前に、uVertexCountを0に設定し、頂点シェーダーが呼び出されるたびに、この値をインクリメントします。フラグメントシェーダーは、uVertexCountを調べることでラインインデックスを決定できます。次に、開始値と終了値、またはその他の手段の間で色の値を補間することができます。ただし、これは、すべての線または点がプリミティブと見なされるか、線の配列全体が単一のプリミティブであるかによって異なります。
これは実行可能ですか?フラグメントシェーダーごとに頂点シェーダーが何回呼び出されるかわかりません。呼び出しは、実行可能にするためにこのような方法でインターリーブされていますか?つまり、頂点0、頂点1、x *フラグメント、頂点2、頂点3、x*フラグメントなどです。
誰かが概念を示したり、似たようなことをする他の方法を教えてくれるかもしれない合理的なサンプルコードを知っていますか?