我在PowerVR网格绘图代码中发现了这一点,我真的不知道如何阅读它.
&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?这是对无效转换的引用作为无符号短指针然后偏移(3*mesh(etc ...)+ batchNum)?它打破了我的大脑.
它是在glDrawElements调用的上下文中找到的:
glDrawElements(GL_TRIANGLES, i32Tris * 3, GL_UNSIGNED_SHORT,
&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]);
Run Code Online (Sandbox Code Playgroud)
让我们从里到外.
(unsigned short*)0
Run Code Online (Sandbox Code Playgroud)
这是0一个无符号短指针.这将用于计算根据无符号短路的大小计算的存储器偏移.
3 * mesh.sBoneBatches.pnBatchOffset[batchNum]
Run Code Online (Sandbox Code Playgroud)
据推测,这是一些三角形的记忆偏移.三角形由3个短裤组成,因此看起来它们以三角形数量存储偏移量,然后乘以3得到短路数量.
((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
Run Code Online (Sandbox Code Playgroud)
现在使用该0指针来查找给定偏移的内存位置.这通常会返回该内存位置的值,但是它们需要一个指针传递给glDrawElements,因此使用&运算符来获取指向该内存位置的指针:
&((unsigned short*)0)[3 * mesh.sBoneBatches.pnBatchOffset[batchNum]]
Run Code Online (Sandbox Code Playgroud)