我们目前正在用3d做一个赛车游戏,碰到模型透明贴图和mesh中部分属性无效的问题。求助高人!
1,关于赛道场景制作。 目前我用unity摆设赛道场景,并自定义脚本导出各个模型的位置,缩放和网格空间占比为json文件,再将json文件通过cocos2dx解析,并用sprite3d加载到游戏中组建场景,由于unity和cocos2dx用的坐标系不同再进行了一次坐标系转换。如果贵方能给你们的场景编辑器试用,将非常感谢。
2,目前遇到的问题:
1)透明贴图,由于场景中使用了一些面片模型加载树木,草丛等使用了含透明通道的贴图,在3.3的版本中,透明贴图90%能正常显示,3.4final版本透明贴图完全透过了场景上其他3d模型,看着就行是一面镜子一样。我不得不将工程切换到3.3版本继续开发,但是3.3版本也仍然有部分问题,并未完全解决。
2) 模型中有些属性无法处理。 比如下面这个c3t中的属性
“attributes”: {
“size”: 3,
“type”: “GL_FLOAT”,
“attribute”: “VERTEX_ATTRIB_POSITION”
}, {
“size”: 3,
“type”: “GL_FLOAT”,
“attribute”: “VERTEX_ATTRIB_NORMAL”
}, {
“size”: 4,
“type”: “GL_FLOAT”,
“attribute”: “VERTEX_ATTRIB_COLOR”
}, {
“size”: 2,
“type”: “GL_FLOAT”,
“attribute”: “VERTEX_ATTRIB_TEX_COORD”
}, {
“size”: 2,
“type”: “GL_FLOAT”,
“attribute”: “VERTEX_ATTRIB_TEX_COORD1”
}],
其中只有position和Tex属性被正常解析使用了,其余的均不正常。我追查代码发现加载Sprite3d中的该方法genGLProgramState 如果场景中使用了灯光,法线属性可以使用。但是另外两个color和tex1不能使用。sprite3d代码中使用的shader并不包含color和tex1的使用。请问目前这块有什么额外的fbx制作规范需要遵守,我看fbx导出规范限制texcoord限制4个以内,我最多只用了2个,不知道texcoord1的属性是什么时候加载的,还是压根就没有加载。
if (hasSkin)
{
if (hasNormal && _shaderUsingLight)
shader = GLProgram::SHADER_3D_SKINPOSITION_NORMAL_TEXTURE;
else
shader = GLProgram::SHADER_3D_SKINPOSITION_TEXTURE;
}
else
{
if (hasNormal && _shaderUsingLight)
shader = GLProgram::SHADER_3D_POSITION_NORMAL_TEXTURE;
else
shader = GLProgram::SHADER_3D_POSITION_TEXTURE;
}
sprite3d用到的shader 3d_position_texture 或者3d_postion_normal_texture。这两个shader在加载属性数据时只是拷贝了顶点位置,纹理或者有光照时还加载法线。 但是color,texcoord1,texcoord2这些是什么时候加载属性数据的,这部分在源码里面我没看到,我只看到所有默认shader加载时获取了各个属性在gl中的location,但并未找到给属性对应location加载数据。
另附几张我们的demo效果看看透明贴图部分的问题,因为我远处天空用了一张半屏高的背景,下面部分是黑色的scene,所以透明贴图透过其他模型显示了黑色。