我在一个 android 应用程序中绘制了少量相当大的网格(实际上来自 srtm 数据的地形),我希望它运行得更快(或者在速度较慢的设备上可以接受地运行)。目前,我使用 1 个浮点缓冲区用于顶点数据,1 个字节缓冲区用于法线。
将 2 个缓冲区合并为 1 个缓冲区会提高性能吗?我在这里和博客中发现了一些帖子,声称单个缓冲区会更好,但几乎没有确凿的证据。
测试用例使用 6 个独立的网格,每个网格有 65k 个顶点和 128k 个三角形。(我正在使用drawelements,因为每个顶点最多可用于8个三角形)。
颜色(到目前为止)是根据顶点着色器中的点高度计算的,因此我不需要将颜色信息作为属性数据传递。
这是在标准 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;
}