Помогите мне оценить этот кастинг - PullRequest
3 голосов
/ 29 октября 2009

Я нашел это в коде рисования сетки PowerVR, и я действительно не знаю, как его читать.

&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]

Что здесь происходит? Является ли это ссылкой на void, приведенный в качестве короткого указателя без знака и затем смещенного на (3 * mesh (etc ...) + batchNum)? Это ломает мне мозг.

Он находится в контексте вызова glDrawElements:

glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT, 
               &((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]);

Ответы [ 4 ]

6 голосов
/ 29 октября 2009

Пойдем изнутри.

(unsigned short*)0

Это приведение 0 к беззнаковому короткому указателю. Это будет использоваться для вычисления смещения памяти, вычисленного в терминах размера короткого знака без знака.

3 * mesh.sBoneBatches.pnBatchOffset[batchNum]

Это, по-видимому, смещение в памяти некоторой партии треугольников. Треугольник состоит из 3 шорт, так что похоже, что они хранят смещение с точки зрения количества треугольников, а затем умножают на 3, чтобы получить количество шорт.

((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]

Теперь используется указатель 0, чтобы найти ячейку памяти данного смещения. Обычно это возвращает значение этой области памяти, но они хотят, чтобы указатель передавался в glDrawElements, поэтому используйте оператор &, чтобы получить указатель на эту область памяти:

&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
2 голосов
/ 29 октября 2009

Он вычисляет смещение байта - 3 * mesh.sBoneBatches.pnBatchOffset [batchNum] - индекс Использование 0 в качестве указателя означает, что адрес будет просто значением смещения, ничего больше.

1 голос
/ 31 октября 2009

Действительно, этот вид хака происходит из-за того, что OpenGL выражает смещения внутри объектов буфера через аргумент указателя glDrawElements.

glDrawElements(mode, count, type, void* indices)

indices представляет либо память на стороне клиента указатель , либо память на стороне сервера смещение на основе привязки GL_ELEMENT_ARRAY_BUFFER_ARB

Интересно покопаться немного глубже ... Из спецификации VBO :

Законно ли C использовать указатели в качестве смещений?

Мы не пришли к окончательному выводу по этому поводу. [...]

Были высказаны различные мнения относительно того, является ли это законным, хотя никто не мог привести пример реальной системы, где возникнут какие-либо проблемы.

0 голосов
/ 29 октября 2009

Это запутанный способ вычисления

sizeof(unsigned short) * 3 * mesh.sBoneBatches.pnBatchOffset[batchNum]

но так как он не сохраняет никаких символов, это не очень хорошая запутанность

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...