凹凸贴图骑砍.doc_第1页
凹凸贴图骑砍.doc_第2页
凹凸贴图骑砍.doc_第3页
凹凸贴图骑砍.doc_第4页
凹凸贴图骑砍.doc_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Green Normalmaps. 绿色及全色法线贴图讲解【已翻译】原帖地址: /index.php/topic,177923.0.html讨论者: Sunnetci_Dede、 mtarini、 Yoshiboy 等这个贴提到了很深的3D技术内容, 求专业人士翻译,应该对制作很有帮助。不是翻译顶楼而是通篇翻译Dede:I was not satisfied with the DXT5 compression of normal-map textures . It caused ugly artifacts ingame. So I wanted to try other DDS settings and got the best results with DDS 8.8.8 (not compressed). But the File-Size has increased from 1.33MB to 4MB.For this reason, I wanted to find a better solution, and Ive read in the forum about green normal-maps.How I converted purple normalmap to green normalmap:1st Load to previously created purple normal map with your image-editor (Photoshop for example)2nd Create a Alpha Channel3rd Copy the red channel in to the alpha channel .4th Delete the red channel (= completely fill with black)5th Delete also the blue channel(= completely fill with black)6th Save the image as DDS(DXT5)This is the standard normalmap in Openprf: 下载 (67.15 KB)2011-6-26 00:58This is how my green normal map look like: 下载 (75.31 KB)2011-6-26 00:58And heres the problem with which I am struggling at the moment. 下载 (171.78 KB)2011-6-26 00:58As you can see the green normalmap is not displayed correctly.I have not figured out yet why this is. Maybe someone has an idea?标题:绿色法线贴图1楼(Sunnetci_Dede)嗨!我对于将法线贴图纹理压缩为DXT5格式这种压缩方式并不满意。这样制出的图在游戏里很难看。所以我曾想试试DDS文件的别的设置并得到了DDS的8.8.8格式(未被压缩的)的最佳的结果。但是文件大小从1.33兆字节升到了4兆字节。由于这个理由,我想找到一个更好的解决方法,并且我已经阅读了论坛上的关于“绿色法线贴图”的文章。我是如何转换“紫色法线贴图”为“绿色法线贴图”的:第1步 用你的图像编辑器载入之前创建的紫色法线贴图(比如用Photoshop)第2步 创建一个阿尔法通道第3步 将红色通道复制到阿尔法通道第4步 删除红色通道(=彻底用黑色填充)第5步 同样删除蓝色通道(=彻底用黑色填充)第6步 保存图像为DDS文件(DXT5格式)这便是在OpenBrf里面的标准的法线贴图:【图1】而我的绿色法线贴图看来是这样的:【图2】而我此刻费力面对的就是这个问题。【图3】如你们所见,绿色法线贴图没有正确显示。我还没有想出为什么会这样。也许有人知道?三楼内容,希望对模型组有所帮助 Artizan:做凹凸贴图你不需要任何阿尔法通道, 以dxt1格式保存紫色贴图(无阿尔法通道), 它就会变小. 据我所知绿色贴图采用的是不同的阴影, 是原版用的,不是战团的。就像我说过的,压缩DDS材质不适合做法线贴图。而dtx1压缩比dtx3或5更差。我想在品质和文件大小之间找一个平衡。所以我才要用绿色法线贴图,因为虽然采用dtx5压缩,但是图像品质好,而且文件大小跟一般的dtx5一样 rgcotl:楼主的模型很强大,在论坛上见到这样的东西真是太酷了关于紫色贴图我能给楼主的建议就是:不要为高模使用任何mipmap(若要为低模使用,为它创建一个新文件)顺便一提,如果我没记错,战团引擎只支持压缩DDS格式,所以模型的很多特效都显示不出thx,为了头盔我真的牺牲了很多时间,不用mipmap的话,贴图会闪烁我已经通过Photoshop的NVIDIA dds插件测试了所有DDS格式设定,发现发现骑砍除了压缩格式外,其实可以支持其他格式的。例如:8.8.8RGB 24bpp | unsigned(是我为高品质法线贴图所用的格式,缺点是文件明显增大了)8.8 VU 16bpp | signed(可以为法线贴图实现闪亮效果).在OpenBrf编辑器中两种效果都不能显示,但是会在游戏中显示 Rath0s:骑砍中绿色法线贴图是做场景用的.骑砍中有绿色法线贴图的材质大多来自阴影文件bumpmap_interior(内部凹凸贴图),我在OpenBrf里发现的。那意思是不是我不能把这些法线贴图用在模型上。那就真悲催了本帖最后由 dunklerprinz 于 2011-6-27 19:57 编辑 四楼翻译 xenoargh:战团引擎的标准阴影采用的是RGB DDS DXT1格式,这样可以减少文件大小,并尽可能在显存中高效地存储想要在非静态物件(只需要绑骨骼的盔甲等)上使用绿色法线贴图,你只能使用自定义阴影,这就要求你设定你的剧本使用战团版的加载器应用(不懂),也就强迫一般玩家用这种方式打开剧本实话实说,我没发现DDS DXT1格式的模型有什么大问题,只要把灰阶高度图调整好。减少出错率有很多小技巧,比如说转换格式前减少调色板(色调?)如果你的模型的压缩错误多到在游戏中很丑,你应该做一些微调。用非压缩的8888对游戏的运行非常不利,更不要说文件大小;这些文件在显卡处理中也是非压缩的,效率低的可怕rgcotl:蓝色法线贴图只是一个3通道贴图(rgb),所以你选择什么格式对于品质没有什么影响(不管是dxt1、3还是5)灰色法线贴图是4通道的(包含阿尔法通道)所以采用dxt5会改善贴图品质(平滑阿尔法通道的效果)现在我所用的贴图都没有mipmap(因为我知道像mipmap这样的东西会被显卡所用)而就我所知如果你在骑砍中使用mipmap,图像会变模糊(原文bloored疑为blurred之误)而且不同的程序比如gimp或者做DXT压缩的效果是不同的,但photoshop我说不好因为我没测试dxt1的压缩比为8:1,dxt5为4:1在某些情况下品质应该有所不同关于DDS格式的比较,请参考下面的链接/tutorial/dds_types.html为了展示区别,我也做了截图,有8.8.8和dxt5或者dxt1三种格式你会发现dxt1和5没有明显的区别,但8.8.8是我想要的效果五楼翻译 xenoargh蓝色法线贴图只是一个3通道贴图(rgb),所以你选择什么格式对于品质没有什么影响(不管是dxt1、3还是5)如果我没记错,DXT3和DXT1/DXT5是有区别的,但我忘了是啥区别,而且DXT3是DXT1大小的两倍,所以用哪个就不言而喻了,呵呵 灰色法线贴图是4通道的(包含阿尔法通道)所以采用dxt5会改善贴图品质(平滑阿尔法通道的效果)之所以选择特定颜色可以得到更好的效果是因为他们有更大的数位深度,而且能更好的保留灰度。但他们使用的通道数相同,除非阴影做了倾斜/视差,用第四通道做深度效果 现在我所用的贴图都没有mipmap(因为我知道像mipmap这样的东西会被显卡所用)而就我所知如果你在骑砍中使用mipmap,图像会变模糊mipmap在战团中也能用,原版我不知道,但你说不能用我很惊讶,如果是模糊,应该是你的DDS导出设置不正确;有很多锐化设置需要调好。不同的导出插件(如gimp、和The Compressionator等等)都有不同的锐化度的控制;Photoshop的导出插件是目前最好的,它可以精细地控制每mip应用多大的锐化度,采用什么算法,等等等等六楼翻译 Yoshiboy留言据我所知绿色法线贴图只能用于平面,因为平面上法线向量的最终分量很容易被重建(求PS高手解释)。你可以试试但我不推荐非压缩的.dds材质减少贴图错误(原文:artefact)的一个技巧是调低高光度,我觉得这才是模型区别加重的原因你也可以试一下更多噪点或更精细的高光贴图这样会让贴图错误看起来不明显并且获得非压缩贴图的颗粒效果不管什么方法我觉得在游戏中差别都不是很明显,大多数玩家也不管。他们只要运行流畅高品质的法线贴图必须有各种自定义的压缩算法的支持(指游戏引擎)。据我所知cryengine2代和3代(孤岛惊魂系列的3d引擎)都用了更加成熟的压缩技术。但骑砍达不到这个水平,所以也不是可以mod的。最后,还有个方法,我看别人做软表面细节的时候用过的,你可以叠加更多细节的,密集的(原文tiled,马赛克或瓷砖)法线贴图,它可以把微小的细节呈现在打光里,而且跟我上面说过的高光贴图一样,可以隐藏平滑表面明显的带状痕迹。楼主回复你们说的对,最佳化原则是首先要考虑的。就因为这个,我已经尽量把四个头盔的贴图都弄进一个文件了我的像素化贴图的显示问题只出现在chichak头盔上。而且在光线较暗的地方才更明显。其他的头盔看起来都很完美我改变了素材Spec RGB和Coeff,然后效果有些改善。但我会给法线贴图采用5.5.5格式,2.66MB而已,天塌不了。PS:想想吧,有的头盔有1886个面,而且没有低模。在cRPG有100多个玩家(所以别跟我说系统支持不了神马的)1 评分次数7楼mtarini纯理论派,膜拜一下,本人数学一向很差,希望可以翻好mtarini:回复哇哦,SD,做的不错啊不仅做了测试而且还放了截图,我觉得这不仅仅是有用,而且你的尝试本身就是科学而有趣的研究,这已经超出骑砍这个平台了。万恶的昏割线我只能贡献一点理论知识了谁都知道,法线贴图把法线信息(表现为局部坐标系或法线-切线-双切线)存储到每个纹理素(即像素)。一条法线就是一个3d单位向量。全部可能的法线构成的空间可以具象为单位球面的表面:球面上的每一个点都是一条法线,反之亦然。那么,你肯定愿意表现尽可能多的法线,即那个球面上尽可能多的点,但是,由于压缩的原因,你只能表现有限的点,有的表现不出。你要想让表面的那个点有所表现,必须在它的位置加一个其他可表现的点(于是就出现了压缩图像错误artifact另一参考译文)。在给定的压缩计划下,我理论上可以用铅笔在计划要求的球面区域的每个点都点一下。现在我问你,在这个球面上我共得到多少点?他们的分布如何?是否集中在我需要的区域?答案将决定法线贴图压缩计划的好坏。切记法线是一种单位向量,就是说我只关心其在单位球面上的分布现在我们从这个角度讨论一下各种压缩计划的表现万恶昏割线+1存储为蓝色法线贴图blue(*)意味着将法线的XYZ三个分量保存到RGB通道。我不知道游戏是否会重新定义它们,但我们假设它定了,这就是DXT1压缩计划,因为你没有使用阿尔法通道。(*)该贴图呈现蓝色是因为通常法线指向外面(带有细微变化),也就是说大多数法线都差不多与网格模型的几何法线方向重合。在法线、切线、副法线组成的空间里这意味着“法线”这一分量往往是是合一的,因此蓝色分量也往往是合一的。在这一计划下,你必须想象一个内部有单位球面的实心双面立方体,这些就是你能够存储在一个像素里所有可能的RGB颜色。由于压缩,你实际能表现的只是散落在立方体内部的由点构成的一团云,又好像鱼缸里的一群鱼。这团点构成的云是相当一致的,或多或少地都与一个隔栅对齐(因为量化了)那就是说,鱼列队游泳。现在我们将之标准化,亦即将每个点投射在球面上(向内或向外)。在球面上你将得到哪一组点?问题出现了,浮动在立方体内的许多点将投射在球面上同样的点。你将得到一组在球面上分布得很不好的点,尤其是在球面的赤道和两极,在你能够表现的点之间将存在许多空隙现在我们来试试DXT5 计划。法线贴图看起来是绿色,因为只有绿色通道和阿尔法通道被启用(法线的双切线和切线分量)。这次你应该想象一个平面上的正方形将球面一切两半,在赤道处与其相交。在这一正方形里,你得到与蓝色贴图的立方体内数目相同的点,实际上更多,因为DXT5每像素的比特率更高。现在将这些点投射到球面,即将他们抬升到与球面接触的高度(所以底下的半球不要了?)位于球面以外的有些点将不能投射到球面上。这些点在压缩中丢失了:他们就是与无法线相关联的颜色(但这才只占全部点的1/4,准确的说是(4-pi)/4)不过,这是好事,其余点在球面上分布得很完美。所以你发现DXT5比DXT1多三大好处:首先,你有更多可用的点;其次,这些点位于平面而非立方体上,因此在球面上分布的更好;最后,这些点只集中在球面的上半部分,而不是散落四处,这才是你想要的法线表现方式(如果你的法线贴图提示网格表面上某个点应该指向真实几何法线的反方向,说明你的法线贴图做错了)。我们再来看看(8.8.8)计划,它跟DXT1很像,但初始点多得多。这种格式有256*256*256个点浮动在立方体中,它有DXT1所有的压缩缺陷,但你看不出来,因为有太多的点,就算许多点投射在球面上同样的位置,你还是剩下很多。A(4.4.4)计划也有同样的问题,只不过更加明显罢了A(8.8)计划可能会创造奇迹,因为它有上面DXT5所有的优势,但同样起始点很多,我估计它会出现跟8.8.8相似的结果,或许更好,且占用空间小。但可是,你要不就得找一个存储绿色和阿尔法通道的非压缩格式的DDS表面,要不你就得用一个骑砍能识别的自定义阴影。纯理论,累屎人收八楼mtarini: 引用Yoshiboy:太受启发了,这是个更直观展示不同压缩方法的好办法。那是不是说DXT5_NM贴图必须用跟“蓝色”切线空间法线贴图不同的方式生成?肯定不是就把蓝色通道扔掉那么简单吧?引用Barf是的,就是把蓝色扔掉,因为红绿通道之间的差别怎么也会影响到蓝色通道,这个问题往往是在加载过程中通过阴影解决的,或者同步处理(on the fly)如果游戏采用了虚拟引擎(或其他以流媒体streams?方式运行的引擎)z = sqrt( 1 - x*x + y*y );战团用这个公式计算所有静止物件、海面和水面的阴影在蒙皮阴影上包括这一计算并不难,所以在所有模型上都可以做xGxR贴图。3Dc应该能跟xGxR贴图交互但会让战团崩溃mtarini:回复你当然可以这么做,但是然后你得根据对结果的解读写自定义像素阴影你知道,Barf也说了,通常标准的读取“绿色”DXtT_NM法线贴图的方法是:把绿色-阿尔法像素分别当做XY分量,在0,1到 -1, +1之间取函数f(k)=k*2-1,得到Z值=(1-X²+Y²)的平方根就像Barf说的,在这个标准案例里,你要给法线贴图编码,你就必须扔掉Z通道(把XY编为绿色阿尔法)但你要是想,你也可以用别的设定,只要你的编/解码有内部一致性(编码指你创建法线贴图,解码指投射到像素阴影)比如我想到另一个解码方法,我觉得挺有道理的“如上读取XY,赋Z值为1,还原XYZ(原文renormalize)”现在来看看输出的压缩计划表现如何这种情况下,你的色点位于一个两面正方形内,它不穿过球面的赤道,而是平衡放置在其顶端,与球面北极相切。这个方形不是垂直的投射到球面上(以前都是),而是指向球心。语言难以表达(不如汉语了吧)但我相信你能想象出来。结果是什么呢?首先你不会浪费那大约25%的绿色/阿尔法值,在标准计划中它们不与任何法线关联(这部分数值在标准公式中得到的是一个负数的平方根,也就是落在圆的外面);这已经够好了,更好的是(从另外的角度看也是不好)你的点都投射在球面的上半部,且都在横截面以上。在实践中这意味着你不可能存储法线的方向,它们大大地偏离(大于45度角)真实几何法线(即不借助法线贴图你也能看到的那条),但这样你能专注于法线的微小变化,也就没有那么多压缩图像损耗影响到编码。你可以较少表达明显的法线变化,但却能减少压缩图像损耗注意某种意义上讲,标准DXT5计划对于DXT1也有相似的优势,但没有那么极端:在DXT5_NM中,你不能编码偏离大于90的法线(因为z总是0)但这不是唯一可能。比如你可以设Z=K(K为常量),并还原。最大值K被使用了,你的法线更集中于球面的极点,也就是你缩小了可允许的与真实法线的偏离,但你还可以通过柔和平滑的微调减少表面的损耗。如当K=3时,你的法线偏离不大于30度在某些实例中这样比较好。比如我要为为一辆闪亮的跑车外壳做法线贴图。法线偏离是很小的,正因如此,我需要把注意力集中在压缩损耗上(甚至是量化损耗)他们可能会很难看。那么我就要把K值调高,比如调到4实践中可能遇到的问题是你需要通过自定义的方式给法线贴图编码(并在阴影中相应地解码)而我认为DXT5_NM的魅力在于它是一种标准编码,能被生成法线贴图的程序识别,渲染引擎因此能够识别,并兼容DXT1格式(蓝色贴图)也有类似问题,如果你生成贴图的程序能将法线识别为XYZ,并且能更进一步:在编码时能拾取RGB颜色并在标准化后生成最接近XYZ的XYZ向量(就是说向量的模也可以用大于或小于单位长度),懂我的意思不?但我还没听说过用这种最佳化原则输出法线贴图的程序。他们都是把法线的分量量化,并试图存储已经标准化的法线(因为量化和压缩,这不可能实现)。我觉得吧,这是因为:(1)他们太懒/压缩追求速度;(2)他们不确定阴影其实可以在读取法线贴图后可以还原法线(3)这种最佳化方法对于存储北极周围的法线帮助不大,因为这时候最需要精确(其实我这方法对精确也有帮助的)Yoshiboy:其实在孤岛3引擎上他们就是这么做的,但是编译环境不太一样。事实证明存储标准化法线到G缓冲不太成功。你可能猜到了,因为这连float3能存储的数值的5%还不到他们发明了一种best fit贴图,它根据能给到的最准确的压缩值缩放法线。道理很难解释但你可以看看/cryengine/ . -the-speed-of-light明后天翻10楼请收10楼xenoargh:回复是的,如果有更多数据的话,可视化(用图片)效果更好。眼前的问题很明显;一直以来DDS很多特征都锁定了,因为显卡制造商要稳定的格式,才能更好的处理芯片上的解压,等等非压缩DDS的特性(如果我没记错,为此引擎需要读取BMP;不知道用在蒙皮上是什么效果)就是在显存中它们不被压缩,所以启动很吃内存(从硬盘读取到存储)所以对显卡显存非常不利,因为他们被当做TIFF/BMP处理了但是正确使用压缩工具的话,其实这也不算什么大问题;大多数损耗是mip引起的,我个人经验是。如果设定没问题,就不会出现大面积的贴图错误。例如这张法线贴图吧,我用Dejawolf的Valgard头盔改的(这头盔太漂亮了,我一直渴望更新,但昨晚才找着机会(拿长柄斧的东欧武士、头盔特写)这些截图上开了1024的漫反射(diffuse),但法线贴图/镜面反射只有512。我做这个漫反射是个特例,因为精度过低的时候,这些精美的装饰细节看起来有点毛糙,我我也懒得重建那部分的UV图,懒得把它降低到512然后看起来还一样再看这个实例(希腊风盾牌)原始法线贴图噪点很多,看起来很丑。我大爱原图,为了这个漫反射效果,我用喷枪修了很多,把装饰(?relief)挤进挤出。看起来还是很平,没有倾斜,但很逼真。基本上,做法线贴图,只要漫反射做好了,你的细节就够了,没有超出模型能有的表现能力。大多人遇到的问题是他们压根就不去碰压缩设定,至少对于photoshop插件,默认设置一团糟。11楼完成!狂喜中,就要见曙光了MadocComadrin :我补充一下mtarini说的,一些引擎(不知道骑砍是不是)完全允许法线有小于一的量值(magnitude)。通常这样反射光的亮度会减小同时对于那些看不懂mtarini表述的骑友(其实很有启发的帖子),我把它翻译成大白话多亏了像素阴影,打光可以在每个像素上估值。实现方法是给网格加UV贴图。大家应该知道UV贴图将2DUV赋值与网格的面关联,而面是平的,所以操作变得简单。可是面之中包含无限的点,而我们只能用贴图上有限的点去描绘它。大多数情况下,一个贴图文件上的每个像素根据你UV展开方法的不同被分配到特定的UV关联。结果贴图上所有没被像素覆盖的点也被加载:他们的值(漫反射颜色等)是基于周围与贴图像素有关联的UV计算的想象一个单面的正方形作为我们的网格,我们的UV贴图与该面成比例(即它不会被横向或纵向的错误拉长),假设我们的材质贴图是512*512的。那么这个面就分别有512个整齐分布的纵横列,纵横列的交叉点就是一个像素(请注意我们的UV图可以随面的大小而缩放;若UV不能缩放,就不能整齐地分配)对于漫反射材质,每个像素的颜色被放置到面上相关联的点,没有被覆盖的点也会加入进来;但对于法线贴图就不一样了。法线贴图能控制一个模型每个点的打光。每个点都有一条法线。法线本质上是一种垂直于面的向量,所以完美地垂直于桌面的法线会正直向上。现在把我们刚才的面想象为桌面,为了便于理解,想象我们垂直向下俯瞰桌面,并垂直向下打光。那意味着该面的法线必将垂直指向我们。我们的光是垂直射出,而法线是垂直向上,所以该面的反射光必将垂直返回来(英语真啰嗦,中国人看到上一句已经懂了)继续打光部分之前,我们来说一下法线向量。多数情况下,法线向量是一个单位向量。就是说它的量值为1。想象一根恰好单位长度的毛发从面的中心垂直向上。这就是该面的法线。现在我们抓住这根毛发的一段并移动它,这将改变光反射的路径对于法线贴图,想象我前面说过的每个交叉点都有一根这样的毛发,这都是我们的法线。移动任何一根毛发,这个交叉点的光反射路径都将独立地被改变。对于面上那些没有被交叉覆盖的点,发现也会被加入(即点一的那根毛发面向左边,点二的面向右边,则他们中间的点首先指向做,然后向上,最后向右)我们如何告诉显卡这些毛发如何移动?骑砍有两种办法。蓝色法线贴图和绿色法线贴图(看起来像不像石灰浆?lime jello泥子?)在蓝色贴图上,一个像素有多红,决定法线在X轴上的偏转程度;中红是不偏转,没有红色说明都指向一个方向,全红则是反方向。绿色决定Y轴(中绿还是不偏转),蓝色决定法线的端点距离表面的远近,全蓝色是一单位,没有蓝色是零单位。对这种贴图而言,法线既然不能超过一单位向量,你的色彩组合是有限的。如0,0,1(RGB从0到1)可以,而1,1,1不行对于绿色-阿尔法贴图,绿色决定法线的横向偏离,阿尔法通道决定纵向偏离。其余的(即蓝色(应为笔误)法线贴图的蓝色部分)在运行时间内计算。取决于DDS压缩色彩,这种贴图适合大型平整表面,因为它需要很精细的法线贴图。类似于蓝色贴图,可用色彩是有限的。你甚至不用管第三种颜色,因为这部分将在稍后计算12楼Sunnetci_Dede:楼主回复童鞋们的回复都很有启发啊。非常感谢两位大大耐心解释法线的工作原理。 引用MadocComadrin:对于法线贴图,想象我前面说过的每个交叉点都有一根这样的毛发,这都是我们的法线。移动任何一根毛发,这个交叉点的光反射路径都将独立地被改变。对于面上那些没有被交叉覆盖的点,发现也会被加入(即点一的那根毛发面向左边,点二的面向右边,则他们中间的点首先指向做,然后向上,最后向右)所以基本上可以说法线贴图上的每个像素代表了面上法线的类别。它依赖于光照射到这些线(法线像素)的角度和法线贴图的外观,并将决定面上的光影效果。从而让我们觉得它是个多边形模型的面回复xenoargh 回复所有人all : ) 引用xenoargh:想要在非静态物件(只需要绑骨骼的盔甲等)上使用绿色法线贴图,你只能使用自定义阴影,这就要求你设定你的剧本使用战团版的加载器应用(不懂),也就强迫一般玩家用这种方式打开剧本自定义阴影我确实不懂,也不知道如何创建。如果有谁能教教我我就太感谢了。我需要一个有高光强调的阴影(类似于高光_阴影_蒙皮_凹凸_高,估计是楼主自己起的名字),我可以用这个做绿色法线贴图还有,“加载器应用”是啥?(翻译官我也想知道)是不是像那个以brf格式保存“自定义阴影”到modResources(模型文件夹)一样(此句比较拗口,希望大家能明白)。把模型添加到module.ini然后运行mod?这样不行吗?我在这里把标准法线贴图跟绿色贴图做了比较,在不同的阴影条件下(图片我打不开)看见没,standart_shader_skin_bump_nospec_high和bump_static有很大区别(分别是标准阴影-凹凸-无高光-高和凹凸-静态)。看起来绿色法线贴图能够创造更大的景深。也可能是阴影的作用。PS:英语不是我母语,希望乃们能懂我意思翻译官PPS:边翻译边吐槽其乐无穷啊mtarini: 回复 引用Sunnetci_Dede:自定义阴影我确实不懂,也不知道如何创建。如果有谁能教教我我就太感谢了。我需要一个有高光强调的阴影(类似于高光_阴影_蒙皮_凹凸_高,估计是楼主自己起的名字),我可以用这个做绿色法线贴图这个网上肯定有教程,不过首先楼主需要:1)写一个你自己的阴影程序,用HLSL语言(高级阴影语言,属于Direct3D)HLSL是一种汇编语言。你需要一个源码(一个叫mb.fx的文件),在游戏运行前汇编。汇编会生成一个叫mb.fxo的文件,跟战团主程序在一个文件夹游戏会加载这个文件,战团运行的时候就是加载这个文件,而不是源码所以要写你自己的阴影文件,你首先要得到源码,修改并添加,重新汇编后得到你自己的mb.fxo,覆盖原文件这样会导致一个问题:你的剧本需要的mb.fxo文件不在MOD目录下,而是游戏根目录。Swyter大神开发的Iron Launcher可以帮你和你剧本的玩家覆盖文件,这对玩家有利在战团的根目录下没有你要的源码,但是你可以在这下,感谢A大及其团队/mb_warband_shaders.zip我肯定不合适在论坛教你怎么写阴影。但是网上教程一大把与本站相关的是这个源码是一系列技巧(算法)的合集,就跟C语言,帕斯卡或者Java写的程序一样,被分割成几个功能(也叫步骤、子程序)每个算法都有独立的名字(这不奇怪,C语言的功能也有)在HLSL里,一个算法一般是一个顶点程序(当激活算法,你发送到显卡的每个顶点如何演绎)和一个像素程序(也叫片段阴影:当激活算法,显示在屏幕上的每个像素如何演绎)的组合如果你要添加新的阴影,你需要添加一个算法到原来的文件,如复制已有的算法,重命名然后修改2)改变了阴影的源码之后,你要汇编它。你需要一个directX SDK,装一个吧。现在你有一个mb.fxo文件了3)下一步,你要在一个brf文件中创建一个阴影物件(object)。这跟创建材质贴图类似。你知道贴图是独立于brf的一个DDS文件,BRF文件包含的texture物件,只是关联到外部文件的一个链接(当然还包括几个附加标记如flag)。同样,BRF文件里的阴影物件也是个关联到外部文件mb.fxo算法的链接(也同样包含一些附加信息这些标记超出我理解范围了。哪位高手懂的话,恳请告诉我!)添加新算法以后,你需要用OpenBrf创建一个到新阴影的链接最保险的办法是用OpenBrf复制一个已有的阴影,重命名,然后指向你的新算法。完成以后你就可以给你的网格添加用你自己的阴影的新素材。俺的教程到此结束注意一个bug:至少1.011有,游戏有时候不能加载新阴影。如果你先以窗口模式运行然后切换到全屏就可以解决。要彻底解决这个bug,你需要把阴影添加到core_shaders.brf。老问题又来了,你不许把它放在根目录的CommonRes文件夹,不是剧本里。还是用IronLauncher覆盖吧测试阴影:在老版808里,有个不用重新加载游戏就能测试阴影的小技巧,有个快捷键可以重读阴影(我记得是ctrl+R,记不住了)我觉得很有用但是现在新版本再也找不着了,要是谁知道(有没有这个快捷键),也要告诉我哟!hr(翻译官表示不懂,结合下文应该是重新编辑帖子留下的代码)编辑:我应该提醒你还有个办法,用ARB语言写阴影ARB是一种低级阴影语言(就像Assembler对于C语言和Java是一种低级语言)。有些人可能不喜欢,有些人则可能大爱用这个方法,你可以把自己的阴影写进一个独立文件,比如可以起名叫foo.pp。你不需要汇编它,因为你写的已经是一种显卡汇编程序。在BRF文件中,你需要让你的新阴影指向该文件,只要把它的算法设成foo.pp就行(可在OpenBrf中完成)凹凸贴图、法线贴图、置换贴图本帖最后由 alixyang 于 2009-9-9 14:31 编辑 Warband 的模型相对于1.011又前进了一步, 现在大多的服装都加上了法线贴图,看起来细腻了很多而原先我们只能在墙壁、树皮上看到一点法线贴图的效果.所以下一轮的模型设计,这个元素是热点.先转这篇文章过来谈谈概念,二楼讲如何制作。其实我本人对模型制作、3D之类完全外行,转这个只是想抛砖引玉,欢迎大家讨论,灌水顶贴就不必了。原帖地址:/html/2007-03/2997.htm作者: FXCarl 首先我想说,对于凹凸贴图在计算机图形领域中的研究,最早开始于70年代末,至今已经有接近30年历史了。NormalMap只是一种目前很流行的凹凸贴图技术,而这里将会介绍一些目前游戏和在XBOX360和 PlayStation3这种新世代主机上将会运用的凹凸贴图技术。BumpMapping 凹凸贴图 做过CG的朋友一定比 FXCarl还要更早的认识BumpMap。这种贴图是一种灰度图,用表面上灰度的变化来描述目标表面的凹凸,因此这种贴图是黑白的,如果节省空间的画,甚至可以把贴图的Alpha通道征用来用作Bump。值得注意的是,这种贴图表面上存储的东西是高度域即每个点和原始表面的高度差,记住,每个点的颜色不是色彩,是高度,一个数值!因此,对这个贴图做任何的操作都会影响到这个物体3D的外观质感。不能凭感觉用事。在游戏中,所使用的算法确切的说应该叫做fake bump mapping ,假凹凸贴图。因为在游戏中BumpMap并没有改变物体的表面而只是影响光照的结果,欺骗眼睛而已。最简单的做法是,直接把BumpMap叠加在已经渲染好的表面上,造成亮度上的扰动,从而让人以为是凹凸的这个很容易理解,把一面白色的墙面有技巧的部分划成灰色就会变成蚀痕,这些诸位会比小的更擅长。而计算复杂度是基本加减法。这个所谓的 FakeBumpMapping 从Geforce2就开始硬件支持,但是从来没有大范围的应用过。不过有趣的是,BumpMap这个东西却从未过时,在后来的渲染算法中,其储存表面高度域的特性仍然发挥着巨大的作用。我们后文再提NormalMapping法线贴图NormalMapping在游戏领域中的实践是一个非常值得记住的时期Geforce3上市,GPU概念出现,硬件可编程流水线的出现(Shaders),NormalMapping是一种凹凸贴图技术,它的另外一个名字叫做Dot3 bump mapping。用于实现它的控制纹理是一张叫做NormalMap的纹理,也是目前大家在讨论如何之作的那种。我们先说说这张叫做NormalMap的图。这张图中存储的东西是每个原始表面法线的迭代,说起来有点复杂,但是不难理解。举例说我们的说面,一般在游戏的3D模型上,表面法线就像是一根站立于桌面的钢笔,垂直向上。而NormalMap中存储的东西就是我们这支表示表面法线方向的钢笔所“应该”指向的方向比如说朝左边倾斜15度。NormalMap有两种主要形式,一种叫做世界空间的NormalMap,一种叫做切空间的NormalMap。第一种在游戏中没有实用价值,我们说第二种,也就是大家最常见的一种。那么,为什么我们看到的NormalMap会有这么奇怪的颜色呢?其实NormalMap和BumpMap一样,即它显示出来的颜色和它所起的作用是没有直接联系的。大家一定对空间坐标的概念非常熟悉了。在NormalMap的定义中,有一个事先的约定,这个约定就是原本表面的垂直方向,我们称为Z轴;而表面的UV坐标两个方向,分别对应X轴和Y轴。(确切的说,应该是称作切线和负法线,但是这两个东西和大家熟悉的UV坐标刚好重叠,所以就用大家更习惯的说法了)然后我们知道如果我们在XYZ轴上各取一个点,这个点的取值位置在-1到1之间,那么我们就可以得到一个指向任何方向的法线方向(不用多解释,大家知道法线是一个向量,向量有方向和长度两个概念,但是对法线来说,长度是不需要的)。但是,请大家注意,我们在描述色彩的时候,RGB三个通道的取值范围都是从零开始的。可是当我们尝试把一个任意的法线保存在一张纹理中的时候,会面临取负值的问题。因此我们要把法线做压缩。方法很简单,把XYZ每个轴上的法线投影长度进行N1/2的运算。这样就把所有的法线压缩到了0和1的范围里。然后我们把XYZ的方向分别存储在RGB三个通道中。似乎我们还没有说到关于为什么NormalMap会是蓝兮兮的原因是吧。那么现在就是公布结果的时候了!首先,我们知道如果在一个物体表面,法线垂直向上,那么它的 XYZ坐标是多少?是0,0,1对不对?然后我们把这个数字按照我们前面所说的压缩方法进行压缩,每个数字加1然后再除以2,那么我们得到的是 0.5,0.5,1对不对?好我们把它代入到RGB中,那么我们会得到128,128,255对不对?好了,试试看在调色板里的颜色吧!P.S.现在FXCarl和你猜个谜,看看FXCarl说的对不对。现在我们在NormalMap上看见一个颜色,这个颜色是219,128,219。那么这个表面的法线方向是垂直向右偏45度。大家用MAX做一个NormalMap看看FXCarl说的对不对?如果你还没有理解NormalMap的意思,或者说你有兴趣再深入了解一些,那么FXCarl再和你说的深入一些。不知道大家对于切空间的理解是什么?我们来个实验,找三支笔。然后其中两只笔在桌面放成互相成90度,笔尾接笔尾。最后我们把第三支笔,笔尖向上,笔尾和那两只桌面上的笔的笔尾叠在一个点上。注意看我们的三支笔!这三支笔就是这张桌面上这个点的切空间坐标了!大家一定想到了原来我们的NormalMap中存储的表面法线方向原来就是一个切空间向量啊,恩没错,就是切空间向量。但是似乎看起来切空间没什么作用是不是?呵呵,我们不妨把桌面换成一个篮球。记住,保持三支笔的互相关系,然后用三支笔并在一起的笔尾去接触篮球的表面。呵呵,发现了没有?切空间的优势在于,在任意表面上,切空间中的坐标都是有效的!也就是说始用切空间中的数据就可以做到和 3D模型的复杂度无关!你可以用在任意的表面,甚至这个表面一直在动也不会影响到NormalMap发挥作用,你说这个切空间是不是很有用呢?让我们回到开头,大家就会发现,如果使用世界空间的NormalMap会有什么样的结果呢?嘿嘿那样会造成一个很尴尬的结果,比如说我们做了一个人物身上的 NormalMap,可是我们的场景中有两个一样的人物,但是他们的姿势和面对的角度都不一样。那么My God 肯定有一个人物的NormalMap是没法适用的!而用切空间的NormalMap就没有问题了。恩,不过这个大家可以放心,MAX或者Maya做出来的NormalMap都是切空间的NormalMap,证明的方法很简单看看这张贴图是不是主要由蓝色构成的OK,下面是重头戏,告诉大家NormalMap是如何发生作用的。使用NormalMap的先决条件逐像素著色。先来说一下传统著色,传统游戏使用的是一个Phong光照模型的简化版,甚至有游戏使用Ground模型。这两种算法的方式都是只对物体3D模型的顶点计算光照,而3D表面上的大面积区域则使用差值填充。逐像素著色是到了Shaders出现之后才有的,因此NormalMapping也是一个Shaders必须的算法。计算一个物体表面漫反射光照的公式是很简单的NdotL什么是NdotL,就是物体表面的法线和光照方向的点积。点积是一个线性代数的问题,美术朋友们可以不用深究,写成程序也很容易:Diffuse = saturate(Mul(Normal,Light);。想要简单的理解就是光线的方向矢量在法线矢量上的投影,然后这个投影的结果变成黑白中间的一个值。我们同样举个简单的例子,用两支笔放在桌面上,然后一支笔不动,令一支笔笔尾和第一支笔的笔尾相连,不动,然后以共同的笔尾做为圆心,移动笔。这时如果我们从一支笔尖往另外一支笔的笔杆上垂直拉一条线(一条垂线)就会看到这时移动后的一支笔在原本的笔杆所投影的长度(就是一支笔的笔尖连垂线到另一支笔的笔杆上的位置,这个位置沿着笔杆到共同笔尾的长度)会越来越短,当两支笔垂直的时候,投影的结果就是零没有光照贡献了。这个容易理解,当光线的方向和一个表面绝对平行的时候,这个表面就会再也接受不到光线了。现在我们引入NormalMap。这时我们的光照计算和以往有点不同,我们把表面的法线用NormalMap中存储的法线来替代。这样当我们在计算表面光照情况的时候,就会因为法线不断的变化而产生比原来丰富的多的明暗变化。至于为什么会感觉出凹凸来这个就是人的眼睛自己骗自己了其实那里本没有凹凸的,但是我们人眼睛太多管闲事了。就像Windows的按钮哪个纯平面的东西我们还以为是凸出来的呢。NormalMap 看来可以增加细节,但是它的缺点也很明显。不过在说缺点之前,要提前说一句NormalMap带来的优势是远远大于它的缺点的。因此仍然是个极好的东西,不要对它有偏见,特别是在我们后面介绍的更牛的技术前面,千万不要。最大的也是最明显的缺点应该就是它的视角问题。因为NormalMap只是改变的表面上的光照结果,并没有改变表面上的形状。因此,表面上看来,似乎只要是不接近水平,NormalMap就不会有视角问题。其实不然,NormalMap因为不能实现自身内部的遮挡,因此不能表现平面上凹凸起伏比较大的场合。比如说我们一个桌面上突出一块,然后在突出的这块东西边上放一支牙签。如果用NormalMap表现,会发现。根据经验,这个凸起会很轻易的挡住我们的视线,让我们看不见那支牙签。可是NormalMap却不会这么做。因此我们一直能看见障碍物背后的东西,这一点是个问题也就是说只有在垂直于平面的时候NormalMap才会发挥最好的作用。这样一来,NormalMap只能用在大家对遮挡关系不敏感的场合,比如场景等,不是不能用于人物,而是用NormalMap的人物不太经得起特写,放大了,角度刁钻了都容易穿帮。虽然NormalMap有个不能平视的巨大问题,但是依然是好处远大于小障碍,因此还是非常值得推广的。后面的几种新兴算法其实都是由NormalMapping发展起来的,因此做为基础的东西,也还是最有理解价值的。P.S. 关于NormalMap的一点秘籍。注意理解NormalMap其实并不是从低模的表面凸出高模的细节的,而是把高模中比最高点的位置低的地方凹进去的!因此低模要比高模大一点点才会很准。大家可以想像成我们是用一个比高模稍微大一点点尺寸的低模石膏模型来把高模雕刻出来的。P.S.2.关于 NormalMap的做法,其实早期发明NormalMap的时候还没有MAX这种这么方便生成NormalMap的方法,NormalMap都是从 BumpMap计算得到的,因此其实通过很简单的算法就可以从BumpMap算出NormalMap的,甚至可以On The Fly(就是让游戏引擎直接读BumpMap然后转换成NormalMap)。因此对于一些建起模来效率很低,但是又能明显增加表面细节的东西,例如水泥表面的颗粒,用画Bump的方式来做是个更好的主意,然后交给技术美工去搞定好了当然你会用ZBursh那就当我什么都没说了,呵呵。说来 FXCarl估计MAX生成法线图的方式也是比较高低模上每个点的高度偏移,然后生成每个UV图素上的高度差来得到一个BumpMap,然后再从 BumpMap变成NormalMap。Parallax mapping 视差贴图 (因为后面的算法都是基于NormalMap的应用,可能看上去没有NormalMapping那么长了,但内容肯定一样精彩的!)视差贴图是一种NormalMapping算法的增强算法,其本质上和NormalMapping没有区别。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论