Androidアプリで少数のかなり大きなメッシュ(実際にはsrtmデータからの地形)を描画していますが、より高速に(または低速のデバイスで許容できるように)実行したいと考えています。現在、頂点データ用に float のバッファを 1 つ、法線用にバイトのバッファを 1 つ使用しています。
2 つのバッファを 1 つに結合すると、パフォーマンスが向上しますか? こことブログで、単一のバッファの方が優れていると主張している投稿をいくつか見つけましたが、確固たる証拠はほとんどありません。
このテスト ケースでは、それぞれ 65k の頂点と 128k の三角形を持つ 6 つの個別のメッシュを使用します。(各頂点は最大 8 つの三角形で使用されるため、drawelements を使用しています)。
(これまでのところ) 色は頂点シェーダーのポイントの高さから計算されるため、色情報を属性データとして渡す必要はありません。
これはすべて、標準の Android VM で実行される Java コードです。
フラグメントシェーダーはユニティ
void main() {
gl_FragColor = v_Colour;
}
頂点シェーダーは次のとおりです。
uniform mat4 u_MVPMatrix;
uniform mat4 u_MVMatrix;
uniform float u_many[8];
const int inflightx = 0; //vector to light in u_many
const int inflighty = 1;
const int inflightz = 2;
const int ambfactor = 3;
const vec3 basecolour1 = vec3(28.0 / 255.0, 188.0 / 255.0, 108.0 / 255.0);
const vec3 basecolour2 = vec3(150.0 / 255.0, 75.0 / 255.0, 0.0);
const vec3 basecolour3 = vec3(0.85, 0.85, 0.85);
attribute vec4 a_vpos;
attribute vec3 a_vertexnormal;
varying vec4 v_Colour;
void main() {
vec3 eyenormal = vec3(u_MVMatrix *vec4(a_vertexnormal, 0.0));
eyenormal = eyenormal / length(eyenormal);
vec3 basecolour;
if (a_vpos.z < 100.0) {
basecolour = basecolour1 + ((basecolour2-basecolour1) * a_vpos.z / 100.0);
} else {
basecolour = basecolour2 + ((basecolour3-basecolour2) * (a_vpos.z - 100.0) / 500.0);
}
v_Colour = vec4(((dot(eyenormal, vec3(u_many[inflightx],u_many[inflighty],u_many[inflightz])) + u_many[ambfactor]) * basecolour),1.0);
gl_Position = u_MVPMatrix * a_vpos;
}