访问Assimp纹理坐标数据时OpenGL应用崩溃问题如何解决?
问题原因
你犯了Assimp纹理坐标访问的典型索引顺序错误:
aiMesh的mTextureCoords成员的第一维索引是纹理通道序号,范围是0到AI_MAX_NUMBER_OF_TEXTURECOORDS - 1(默认值为8),第二维索引才是顶点序号。
你的代码把顶点序号写在了第一维,当循环变量i超过纹理通道最大数量时,直接访问了越界的非法内存,所以打印完第一个顶点(i=0,刚好对应有效0号纹理通道)后就会崩溃。另外没有提前校验对应纹理通道是否存在数据,即使索引写对,碰到没有UV信息的模型也会触发空指针访问崩溃。
解决方法
先调用HasTextureCoords方法校验对应通道的纹理坐标是否存在,再修正索引顺序访问即可,正确代码示例:
// 先校验0号纹理通道是否存在UV数据 if (mMesh->HasTextureCoords(0)) { for (int i = 0; i < mMesh->mNumVertices; i++) { // 第一维是纹理通道序号,第二维是顶点序号 std::cout << mMesh->mTextureCoords[0][i].x << " " << mMesh->mTextureCoords[0][i].y << std::endl; } }
内容的提问来源于stack exchange,提问作者Extorc Productions
相关产品推荐
相关产品推荐

