我在PowerVR网格绘图代码中发现了这一点,我真的不知道如何阅读它。
&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
这里发生了什么?这是对无效转换的引用作为无符号短指针然后偏移(3 * mesh(etc ...)+ batchNum)?它打破了我的大脑。
在glDrawElements调用的上下文中找到它:
glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT,
&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]);
答案 0 :(得分:6)
让我们从内到外。
(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]]
答案 1 :(得分:2)
它计算一个字节偏移量 - 3 * mesh.sBoneBatches.pnBatchOffset [batchNum]是索引。使用0作为指针意味着地址将只是偏移值,没有别的。
答案 2 :(得分:1)
真的,这种破解是由于OpenGL通过glDrawElements的指针参数在Buffer Objects中表示偏移量。
glDrawElements(mode, count, type, void* indices)
indices
表示基于GL_ELEMENT_ARRAY_BUFFER_ARB
深入挖掘更有意思...... From the VBO specification:
将指针用作偏移量是否合法?
我们还没有得出任何明确的结论。 [...]
对于这是否合法,已表达了不同的意见, 虽然没人能提供真实系统的例子 任何问题都会发生。
答案 3 :(得分:0)
它是一种混淆的计算方式
sizeof(unsigned short) * 3 * mesh.sBoneBatches.pnBatchOffset[batchNum]
但由于它实际上并没有保存任何字符,因此它不是一个非常好的混淆