本帖最后由 GeForceLegend 于 2020-7-30 20:05 编辑
注:这个和游玩时方块边界出现透明线条不属于同一种现象,方块边界出现透明线条一般是由于显卡驱动设置的问题,可以在NVIDIA控制面板内将图形设置改为“偏重性能”或者“由3D应用程序决定”来解决。本帖讲的是一个方块的内部的模型出现的棱边异常,不仅限于透明线条,但是一般以透明线条出现。
在为Minecraft的资源包制作模型的时候,经常会发现模型的棱边有一些异常线条(比如透明线条),例如下图活板门内孔的边缘:
这种现象在1.14之前的版本中更为明显。
这种现象的原因是Minecraft在给模型引用贴图之前会先将贴图略微拉伸,导致uv的引用坐标与实际的像素点直接有微小的偏差,从而导致了模型的贴图引用区域稍微偏离预想范围。这种异常现象可以通过给一个较大的面分配一个较小的贴图区域来放大(例如给一个16*16的面引用贴图里面1*1的区域)。
本教程针对的是使用16X贴图的情况,未使用更高分辨率的贴图做过测试。
本教程的数据和方案均为实验得出,暂时没有源代码层面的支持。
测试时,用1.8.9,1.9.4,1.10.2,1.11.2,1.12.2,1.13.2来代表同一大版本的情况,1.8.9、1.10.2、1.12.2、1.13.2、1.14.4测试了开启Optifine的情况。
网易版不在考虑范围内
Minecraft中,模型的每个面对贴图的引用区域由uv的四个数决定,例如[0,0,16,16]就是引用由(0,0)到(16,16)的一个矩形。在Minecraft中一个贴图以左上角为(0,0),右下角为(16,16),水平方向为x轴,垂直方向为y轴,以此决定坐标。经过本人多次测试,似乎小数点后第五位开始的uv坐标对实际的贴图引用影响不大,因此建议uv坐标四舍五入到小数点后四位即可。
对于一个面的贴图引用,x轴方向和y轴方向的偏离互不干扰彼此独立,只与在自身方向上的贴图引用区域有关。因此可以仅需要研究一个方向上的规律,就可以推导出另一个方向上的规律。
在Minecraft中,不同的版本,甚至同一版本开启/关闭Optifine,都可能会使贴图拉伸的规律变化。
我不知道MOJANG是出于什么搞出这种特性的,可能是游戏引擎的问题,也可能是有意为之,但是这确实对模型制作者很不友好。虽然很多时候并不需要用到这种方案,但是一旦到了需要使用这种方案的时候,一个个调数据值还是很麻烦的。但是有这样一个教程总好过面对模型棱边的缝隙而无可奈何要好一些,希望对各位有所帮助。
====前言====
注:这个和游玩时方块边界出现透明线条不属于同一种现象,方块边界出现透明线条一般是由于显卡驱动设置的问题,可以在NVIDIA控制面板内将图形设置改为“偏重性能”或者“由3D应用程序决定”来解决。本帖讲的是一个方块的内部的模型出现的棱边异常,不仅限于透明线条,但是一般以透明线条出现。
在为Minecraft的资源包制作模型的时候,经常会发现模型的棱边有一些异常线条(比如透明线条),例如下图活板门内孔的边缘:

这种现象在1.14之前的版本中更为明显。
这种现象的原因是Minecraft在给模型引用贴图之前会先将贴图略微拉伸,导致uv的引用坐标与实际的像素点直接有微小的偏差,从而导致了模型的贴图引用区域稍微偏离预想范围。这种异常现象可以通过给一个较大的面分配一个较小的贴图区域来放大(例如给一个16*16的面引用贴图里面1*1的区域)。
本教程针对的是使用16X贴图的情况,未使用更高分辨率的贴图做过测试。
本教程的数据和方案均为实验得出,暂时没有源代码层面的支持。
测试时,用1.8.9,1.9.4,1.10.2,1.11.2,1.12.2,1.13.2来代表同一大版本的情况,1.8.9、1.10.2、1.12.2、1.13.2、1.14.4测试了开启Optifine的情况。
网易版不在考虑范围内
====基础知识====
Minecraft中,模型的每个面对贴图的引用区域由uv的四个数决定,例如[0,0,16,16]就是引用由(0,0)到(16,16)的一个矩形。在Minecraft中一个贴图以左上角为(0,0),右下角为(16,16),水平方向为x轴,垂直方向为y轴,以此决定坐标。经过本人多次测试,似乎小数点后第五位开始的uv坐标对实际的贴图引用影响不大,因此建议uv坐标四舍五入到小数点后四位即可。

对于一个面的贴图引用,x轴方向和y轴方向的偏离互不干扰彼此独立,只与在自身方向上的贴图引用区域有关。因此可以仅需要研究一个方向上的规律,就可以推导出另一个方向上的规律。
在Minecraft中,不同的版本,甚至同一版本开启/关闭Optifine,都可能会使贴图拉伸的规律变化。
====各版本的贴图拉伸规律====
1.8(无论是否开启Optifine,L5版本以前)及1.9~1.13(不开启Optifine)
1.8(Optifine 1.8.9 L5及之后的版本)1.9~1.13(开启Optifine)
1.14以后(无论是否开启Optifine)
====解决方案====
1.8(无论是否开启Optifine,L5版本以前)及1.9~1.13(不开启Optifine)
1.8(Optifine 1.8.9 L5及之后的版本)1.9~1.13(开启Optifine)
1.14以后(无论是否开启Optifine)
====结语====
1.8(无论是否开启Optifine,L5版本以前)及1.9~1.13(不开启Optifine)
1.8(Optifine 1.8.9 L5及之后的版本)1.9~1.13(开启Optifine)
1.14以后(无论是否开启Optifine)
====解决方案====
1.8(无论是否开启Optifine,L5版本以前)及1.9~1.13(不开启Optifine)
1.8(Optifine 1.8.9 L5及之后的版本)1.9~1.13(开启Optifine)
1.14以后(无论是否开启Optifine)
====结语====
我不知道MOJANG是出于什么搞出这种特性的,可能是游戏引擎的问题,也可能是有意为之,但是这确实对模型制作者很不友好。虽然很多时候并不需要用到这种方案,但是一旦到了需要使用这种方案的时候,一个个调数据值还是很麻烦的。但是有这样一个教程总好过面对模型棱边的缝隙而无可奈何要好一些,希望对各位有所帮助。
的确很烦 amd显卡尤其烦 经常被这个bug恶心
本帖最后由 brooke_zb 于 2019-12-3 20:51 编辑
诶,问一下你会不会出现这种情况,用独显(我是1660ti)玩就会有非常严重的异常缝隙,用核显就不会,我在想是不是驱动的问题
@nggcgg2 但是各项异性过滤开了就没法开光影了↓

诶,问一下你会不会出现这种情况,用独显(我是1660ti)玩就会有非常严重的异常缝隙,用核显就不会,我在想是不是驱动的问题
@nggcgg2 但是各项异性过滤开了就没法开光影了↓
brooke_zb 发表于 2019-12-3 14:23
诶,问一下你会不会出现这种情况,用独显(我是1660ti)玩就会有非常严重的异常缝隙,用核显就不会,我在 ...
你这个和模型本身没有关系,应该是显卡驱动设置的问题,在NVIDIA控制面板里面调一下图像设置偏重于性能应该就可以了
brooke_zb 发表于 2019-12-3 14:23
诶,问一下你会不会出现这种情况,用独显(我是1660ti)玩就会有非常严重的异常缝隙,用核显就不会,我在 ...
以前也遇到过这种情况,重置一下显卡设置再重启游戏就行了
brooke_zb 发表于 2019-12-3 14:23
诶,问一下你会不会出现这种情况,用独显(我是1660ti)玩就会有非常严重的异常缝隙,用核显就不会,我在 ...
在显卡控制面板对javaw.exe关闭FXAA抗锯齿即可
好气啊。
得想个办法不自己一遍一遍改。
emmmm
def g(x1,y1,x2,y2):
x1,x2=f(x1,x2)
y1,y2=f(y1,y2)
return [x1,y1,x2,y2]
def f(a,b):
c=((b-a)/16)*0.0313
return a-c,b+c
for element in json_file["elements"]:
for face in element["faces"].values():
face["uv"]=g(*face["uv"])
这样一口气全都给改了行不行?
得想个办法不自己一遍一遍改。
emmmm
def g(x1,y1,x2,y2):
x1,x2=f(x1,x2)
y1,y2=f(y1,y2)
return [x1,y1,x2,y2]
def f(a,b):
c=((b-a)/16)*0.0313
return a-c,b+c
for element in json_file["elements"]:
for face in element["faces"].values():
face["uv"]=g(*face["uv"])
这样一口气全都给改了行不行?
chyx 发表于 2019-12-14 16:38
好气啊。
得想个办法不自己一遍一遍改。
emmmm
没必要每个元素的每个面都改,1.14开始由于贴图拉伸机制更改了一下,只有极少数的元素还要拉伸了,倒是针对1.13或者更早版本的可以考虑一下
膜拜大佬
mcbbc有你更精彩
目前来讲Blockbench插件
Plaster是否能够解决本问题?
Plaster是否能够解决本问题?
Xiao2 发表于 2021-8-12 16:30
目前来讲Blockbench插件
Plaster是否能够解决本问题?
Plaster是单纯的每个边缘向内收缩一定的uv单位,拉的不是精确数值,如果是用在1.13及以下版本的话可以解决引用到其他像素(例如透明像素或者异色像素),1.14往上的问题(例如贴图重合的部分有点闪)以及部分通用问题(使用一大块含有透明像素的面,参考我一楼的橡木活板门,它的顶面和底面是完整的一个面,没有拆开)这玩意没法彻底解决
GeForceLegend 发表于 2021-8-12 17:43
Plaster是单纯的每个边缘向内收缩一定的uv单位,拉的不是精确数值,如果是用在1.13及以下版本的话可以解 ...
嗷嗷,那个活板门是用负模型+单cube做的啊。我以为是cube拼起来的
如果是cube拼接的话应该可以采用内缩的方法吧?
Xiao2 发表于 2021-8-12 18:14
嗷嗷,那个活板门是用负模型+单cube做的啊。我以为是cube拼起来的
如果是cube拼接的话应该可以采用内缩的 ...
cube拼接确实可以,不过在1.14开始游戏会自动内缩(这也是为啥1.14开始反而要外扩才能避免模型面重合时的边缘闪烁)
硬核的教程,涨知识了,感谢大佬分享
经常会发现模型的棱边有一些异常线条,但是不认真看一般看不出来,追求极致值得可敬
巨佬的评论区(