java opengl: glDrawElements () с> 32767 вершинами - PullRequest
3 голосов
/ 02 декабря 2010

это должно быть просто, но я скучаю по нему.

У меня сложная модель, которая имеет> 32767 вершин.теперь индексы могут быть переданы в opengl только как тип GL_UNSIGNED_BYTE или GL_UNSIGNED_SHORT.java не имеет понятия без знака, поэтому опция без знака short сопоставляется с просто (подписанным) short, что составляет 16 бит или +32767.когда я указываю вершины, мне нужно передать opengl короткий [], где значения в массиве указывают на вершину в массиве вершин.однако, если есть> 32767 вершин, значение не помещается в коротком [].

есть ли другой способ указать индексы?фрагмент кода ниже, спасибо.

    short[] shorts = ... read the indices ...;
    ...
    ShortBuffer indicesBuffer = null;
    ByteBuffer ibb = ByteBuffer.allocateDirect(indices.length * Short.SIZE / 8);
    ibb.order(ByteOrder.nativeOrder());
    indicesBuffer = ibb.asShortBuffer();
    indicesBuffer.put(indices);
    indicesBuffer.position(0);
    ...
    gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices, GL10.GL_UNSIGNED_SHORT, indicesBuffer);
    ...

1 Ответ

4 голосов
/ 02 декабря 2010

Я не использовал OpenGL из Java, поэтому я размышляю здесь, но есть хороший шанс, что вы можете просто использовать отрицательные числа, двоичное представление которых совпадает с положительными числами без знака, которые вы действительно хотите. Вы даете GL несколько байтовых пар и говорите им интерпретировать их как беззнаковые, и до тех пор, пока они имеют правильное значение при такой интерпретации, это должно работать. Неважно, думала ли Java, что они имели в виду что-то другое, когда хранили эти биты в памяти.

Если вы выполняете итерацию, просто игнорируйте перенос и продолжайте увеличиваться. Когда вы доберетесь до -1, все готово.

Если вы вычисляете индексные числа как целые числа (у которых нет этой проблемы диапазона), а затем приводите к короткому, вычтите 65536 из любого числа, которое больше 32767.

...