Cocos2D-X 在 3D 中重复纹理

cocos2d-x repeating textures in 3d

本文关键字:纹理 3D Cocos2D-X      更新时间:2023-10-16

我非常想在3D对象上创建一个重复的纹理。

我尝试从Maya导出到.obj。材质文件 (.mtl) 如下所示:

newmtl lambert10SG
illum 4
Kd 0.00 0.00 0.00
Ka 0.00 0.00 0.00
Tf 1.00 1.00 1.00
map_Kd -s 0.1 0.1 grass.jpg
Ni 1.00

行"map_Kd -s 0.1 0.1 草.jpg"应表示纹理正在重复。但是,这根本不起作用。在我删除"-s 0.1 0.1"之前,纹理不会显示。然后它被拉伸了。

我尝试导出为 .fbx,然后转换为 .c3b。相同的结果。纹理被拉伸。

然后我尝试创建自己的纹理。我知道在 OpenGL 中,我必须将纹理坐标设置为>1 才能使纹理重复。这些似乎等同于纹理中的maxS和maxT(?

这是我的纹理设置:

cocos2d::Image *textImage = new (std::nothrow) cocos2d::Image();
textImage->initWithImageFile("grass.jpg");
cocos2d::Texture2D *texture = new (std::nothrow)cocos2d::Texture2D();
texture->initWithImage(textImage);
cocos2d::Texture2D::TexParams texParam;
texParam.wrapS = GL_REPEAT;
texParam.wrapT = GL_REPEAT;
texParam.minFilter = GL_LINEAR;
texParam.magFilter = GL_LINEAR;
texture->setTexParameters(texParam);
texture->setMaxS(10.0f);
texture->setMaxT(10.0f);
sprite->getMesh()->setTexture(texture);

质地仍在拉伸。

通过搜索互联网,似乎我可以使用 setTextureRect 函数在 Cocos 中的 2D 精灵上设置纹理坐标。然而,对于sprite3D来说,这似乎并不存在。

任何想法将不胜感激!

更新:

我设法通过手动编辑 .obj 文件来获得纹理平铺。

显然,CCObjLoader 不理解材料文件 (.mtl) 中的行:

map_Kd -s 0.1 0.1 grass.jpg

删除"-s 0.1 0.1"会使加载器识别纹理(尽管仍然拉伸)。

在此之后,我不得不通过乘以 10 来手动更改 .obj 文件中的所有 vt 坐标。纹理仍然没有重复,直到我将纹理参数更改为GL_REPEAT而不是GL_CLAMP_TO_EDGE。

cocos2d::Texture2D::TexParams texParam;
texParam.wrapS = GL_REPEAT;
texParam.wrapT = GL_REPEAT;
texParam.minFilter = GL_LINEAR;
texParam.magFilter = GL_LINEAR;
sprite->getMesh()->getTexture()->setTexParameters(texParam);

这不是我问题的解决方案,因为我需要应用程序来识别纹理何时应该自动重复。

我还没有破译纹理坐标在 cocos2d 结构中的保存位置,因此在加载精灵后无法更改这些坐标。一个解决方案可能是修复 objLoader,但这不太容易更新 cocos。或者做一个小的.obj文件修复器。这些似乎都不是理想的解决方案...