设置3d物体贴图颜色不对的问题

场景中的一个物体, 默认只是白色的. 之后会加载一张图片, 做为他的 mainTexture.

结果显示的效果不正确, 受灯光的影响强烈. 不知道这个需求的正确做法是怎样的? 希望大佬告知!

如图:

设置贴图部分的代码如下:

function setTexture(mr: MeshRenderer, mat: Material, texture: Texture2D) {
    mat._defines[0]['USE_ALBEDO_MAP'] = true
    mat.setProperty('mainTexture', texture)
    mr.setSharedMaterial(mat, 0)
}

求指教!

不需要灯光,换unlit shader

需要灯光的, 上面的截图明显可以看得出来. 在编辑器中手动创建的. 显示是的颜色 是正常的.
使用脚本的后设置的贴图. 感觉受灯光影响 太强烈了. 这个需求应该很常见的吧? 有正确的方法吗?

如果太亮饱和度太高了,在场景属性里把hdr改成ldr

截图 上下两种效果是在同一个场景中的. 只 不过上面的是使用脚本加载, 下面是在编辑器中创建的

如果这个模型在导出的时候, 设置了贴图, 使用脚本设置贴图的时候 . 显示的颜色就是正常的.

如果导出的时候没有贴图, 是纯色, 在脚本中使用 mat._defines[0]['USE_ALBEDO_MAP'] = true 开启贴图. 再设置mainTexture 颜色就如截图中所示. 发白

通过动态加载的材质和 直接挂载的材质,比较一下,是不是参数上也有设置不一样的地方?

你看看运行的时候也这样,还是只有编辑器里面这样?

如果运行的时候这样,那用log 把材质的所有参数都输出一下,进行对比。有可能是某些光照参数不一样的问题,或者是shader的宏定义不一样的问题。

另外你的需求是运行时换贴图的话,是不是考虑运行时直接换mat呢,用这个贴图做好一个mat,然后运行时换那个mat,比直接在mat里面换贴图,效果要确定一些。
我们有时候切换shader和效果的时候,就是事先做好每个效果的mat资源,加载后替换,而不是在原来mat上改。除了某些动画效果直接要改mat内参数以外,一般建议直接替换一个mat。

感谢回复, 现在的做法是在导出这个模型前先给这个物体放上一张默认的贴图, 之后再在引擎运行时修改mainTexture 这样做得到的效果是正确的. 如果这个材质一开始没有贴图, 在运行时开启mat._defines[0]['USE_ALBEDO_MAP'] = true 再去设置 mainTexture , 效果就是不对的. 发白, 应该是shader中, 有些灯光相关的参数没有被正确的处理. 感觉需要一个 “重新编译” 或刷新这个材质的操作. 但我不清楚是否有这种操作. 试过 mat.initialize() 方法, 但没有效果.
这个问题. 我们应用端可以暂时使用预设贴图的方式来规避. 但是在引擎方面. 还是应该再排查一下具体的原因. 感谢

参数太多了, 主要的参数看了一些., 感觉没有什么不同. 可能是动态改变贴图的时候, shader中有些灯光的相关参数没有被正确的应用到.

另外, 每次都重新创建一个新的material, 会不会造成性能上的浪费呀.
感觉上修改应该比重新创建更环保一些.

不是重新创建新的,而是作为一个资源加载,就好像针对这一张贴图,编辑器里面额外建立一个mat文件,配置上那张贴图。用的时候load那个mat用来替换就好。
不过。就算重新创建,mat不会很耗的,就一些元数据而已。重头是shader的变体编译,那个有cache管理的,就无所谓了。

PS: 我们用mat替换,是也保证一些其他光照参数的配置,这样效果比较稳定可配置。不是仅仅用于换贴图。

多谢!~ 除了重建, 可以使用 clone 一个新的出来吗?因为其它的一些参数都是一样的. 只是贴图不同.

是可以的,这样就可以了

let mat = new Material();
mat.copy(matRes);
if (srd) {
    mat.setProperty('mainTexture', tex);
    srd.setMaterial(mat, 0);
}
1赞