Я не знаю, как нарисованы ваши коробки - но я считаю, что это проблема.При вычислении вершин для каждого блока я предполагаю, что вы делаете что-то вроде этого (псевдокод)
int i,j,k;
float widht
for i,j,k in dims:
upper_left = (i,j,k)*width;
upper_right = (upper_left.x+width,upper_left.y,upper_left.z);
lower_left = (upper_left.x, upper_left.y+width,upper_left.z);
lower_right = (upper_left.x+width,upper_left.y+width,upper_left.z);
Это не удастся, потому что вы теряете точность при добавлении, поэтому углы, которые должны иметь одинаковую позицию, на самом деле этого не делают.Это то, что создает пропуски.
Вместо этого вы должны сделать что-то вроде этого
for i,j,k:
upper_left = (i,j,k)*width;
upper_right = (i+1,j,k)*width;
lower_left = (i,j+1,k)*width;
lower_right = (i+1,j+1,k)*width;
Это гарантирует, что углы будут использовать те же координаты.
РЕДАКТИРОВАТЬ
Это все еще проблема точности.Из того, что я понимаю, вы выполняете вызов на каждый блок, где единственное, что меняется на блок, это ModelviewMatrix
.Это означает, что вы ожидаете, что эта строка
position = ProjectionMatrix * ModelviewMatrix * vec4 (inVertex, 1.0);
даст одно и то же значение для двух разных значений inVertex и ModelviewMatrix, чтоневерно.
Чтобы решить эту проблему, вы можете сделать «фальшивое» создание экземпляров (поскольку ES не поддерживает создание экземпляров), сохраняя значения для каждого экземпляра в униформе и вычисляя значения для каждого атрибута из индекса, указанного в атрибуте..
Редактировать 2:
Хорошо, пожалуйста, пока не думайте о «поддельных» экземплярах.Теперь, пожалуйста, убедитесь, что координаты совпадают.Поэтому вместо предоставления координат только для одного блока укажите их для всех блоков и используйте только один ModelViewMatrix.Это, вероятно, будет быстрее.