将现在对他 发表于 2015-1-18 08:36

技术贴:解决三维出图黑白边缘溢出问题




   我之前做后期时,有时候三维模型渲染出来的图片有黑白边缘溢出,三角形锯齿,为了解决这个问题,我咨询了一些同行和一个在龙渲渲染农场工作的朋友,因为他们公司是做云渲染方面业务,和朋友也是在几次使用龙渲的时候认识的,龙渲的渲染速度比一般的渲染农场更快,发现他们的工作人员在这方面很专业的。这里也顺便给大家推荐一下这个渲染农场,是和梦工厂一样的渲染架构,而且最近有活动可以免费渲1个月,很划算。

   下面,我结合朋友和一些网友的案例,帖子,摸索出了一些解决方法,今天在这里来和大家探讨分享一下,不足之处,敬请指正。

   像素、抗锯齿的基本概念:

   黑白边产生的原因——AA抗锯齿,要知道我们渲染出来的图都是位图,

   在位图中,只有完全水平或者垂直的直线那么它像素都是100%不透明的,任何斜线都必然带有很多透明像素才能让视觉效果看着像斜线。抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体。

   物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,这就是抗锯齿。




   从小图看的话,就是黑色的直线。




   从大图看的话,实则斜线的边缘很多黑色都是半透明的。

   龙渲的朋友说因为每个像素都是一个方格,而且并不是无限小,从近处看是很多像素方格,但是放远了看,就很像一根斜线了。这是位图对图形的一种近似描述方式。而轮廓线边缘这种像素呈半透明现象要做抗锯齿(anti-aliasing)。叫这个名字的原因是,如果边缘轮廓像素都是纯黑色的话,图像看起来就会有明显的锯齿感!




   alpha的两种类型,直通和预乘:

   龙渲的朋友告诉我,带alpha的图片有两种计算方法,一种叫做直通alpha(straight alpha),一种叫做预乘alpha(premultiplied alpha)。这两种类型在AE软件里可以看到的,当你从AE导入一张带通道的图片,比如说Tag。AE就会问你,这张图的alpha是怎么来的,是直通类型还是预乘类型。

   区别:这两种类型的唯一区别在于,直通alpha图片保留最原本的RGB数值;而预乘alpha,是原本的RGB信息乘以alpha的数值以后得到的结果(预乘意思就是预先乘以alpha)。




   我在三维软件中渲染了一个透明的球。




   它的alpha通道明显是这样的。

   但其实这张图片原本并不是你看到的那样,它其实应该是下图所示,你看到的球里面多出来的颜色,是场景本身的背景。过程是这样的:本来完好的一张图,前景和背景都有,你分开渲染的时候,前景部分使用alpha通道抠除,就会得到透明效果,而没有被alpha通道抠除之前的效果呢,就是下图这样的。这两种状态呢,其实就是对应的我们alpha通道的两种计算方式:直通和预乘。




   这张图其实就是一张直通类型的图片,它其实就是我们之前透明的预乘图片,除以alpha值得到的结果,这一个除法的步骤,相当于预乘的原图乘以alpha的逆运算,抵消掉了,就可以得到原始的可以看到背景的图片了;图中黑色区域没有原先的背景,是由于我们这张直通的图片,是通过预乘的图片除以alpha通道的值得来的,因为纯透的地方alpha值为0,任何数除以0都得到无限大,所以这些地方原本的信息已经丢失了,只好显示黑色。

   所以你会发现,直通和预乘,就是两个逆运算的关系。你原图不用alpha去抠,就是直通的效果,乘以alpha以后就是预乘的效果,预乘的效果除以alpha又得到直通的效果。这就是直通和预乘的关系。

   PS中渲染输出黑白边解决方法:

   说回图片黑边白边的问题。当你把渲染好的图片导入ps的时候,比如说你用的TGA,那么,你会有一个背景为黑色或者白色的实心图片,顺带一个alpha通道,你要把这个图合到背景上去,你就会用alpha把图抠了,再放到背景上去。这时候图片就会有黑边,除非你背景是黑色看不出来。




   原因是这样的,你导入ps的图片本身是这样的。




   这是三维软件里直接渲染出来的图,是一种预乘类型的图。也就是说,这图已经被alpha乘过了,你就可以理解成已经被alpha扣过了。但是ps这个软件,它理解不了这个事情,它以为世界上所有的图片都是直通类型的,就是没有过被alpha扣过的图。也就是说,它以为这图本身的背景就是黑色的。而其实这个图是有一个黄色背景的。

   然后,你在ps里面做的事情是用alpha通道去扣这张图,而这张图原本其实是一张预乘的图。或者说,这张图已经被alpha扣过一次了,那么你再去扣一次,会让很多地方看起来比从前更黑,于是黑边就这么产生了。(在图像边缘,有抗锯齿的地方,抗锯齿就是透明,我就不放大看了。)

   而在ps里面想要解决的方案是,把一张直通的图导进去。




   再用alpha去抠,才能得到正确的结果。

   mental ray里渲染得到直通图的方法是勾除premultiply。vray里无法实现。






53376063 发表于 2019-12-11 16:17

啥也没解决,不能抗锯齿 ,出图了还有什么用?

llp007 发表于 2016-5-13 18:39

谢谢楼主分享

红色高跟鞋s 发表于 2015-1-21 09:08

谢谢lz,我这就去试试。

将现在对他 发表于 2015-1-20 09:09

推荐给大家!龙渲网站: ht t p ://www.loongrender.com/。

柳梢青处绾人深 发表于 2015-1-19 09:21

之前遇到过这种问题,但是不清楚原因,默默收了。

打死我都不爱 发表于 2015-1-18 14:53

龙渲云渲染在这方面做的真的很专业,渲染速度确实杠杠的。而且渲染出的图片也很清晰。
{:7_288:}

牵着乌龟 发表于 2015-1-18 08:56

页: [1]
查看完整版本: 技术贴:解决三维出图黑白边缘溢出问题