帮我评估这个演员

时间:2009-10-29 17:26:12

标签: c++ opengl

我在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]]);

4 个答案:

答案 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]

但由于它实际上并没有保存任何字符,因此它不是一个非常好的混淆