总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题
以前做过简单的rim light勾边,几何勾边,这次又做了后处理的勾边,工程化的时候,都遇到很多问题,简单总结一下。
首先是火炬之光勾边效果,类似轮廓光的实现,简单的卡通渲染也是通过类似的算法加采样色阶图实现。
火炬中的勾边相当于为角色添加内测光的效果,即通过计算标准散射点积运算来确定顶点法线N和光线向量L之间角度的余弦,用以确定顶点或像素接收到多少光线:s=L·N。
算法的优势就是:
实现比较简单,通过调整参数就可以开关内测勾边光的效果。可以使用顶点法线,这样更省,火炬中就是vertex Shader中处理的。
算法评估:
效果一般,而且勾边的效果与模型本身的几何关系密切。某些特殊的几何效果很差,例如也无法处理片儿的勾边。
方案简单,使用的指令数有限
不同物体可以有不同勾边的粗细,颜色。
与深度排序、半透明绘制等因素无关。
简单粗暴的法线放大几何勾边法:
算法简单描述:
将模型的顶点沿法线方向外移一定距离得到一个比原模型稍大的模型,绘制时采用剔除正面绘制背面的方式,将模型绘制为边界颜色,
再按正常方式绘制原来的模型,结果就产生了一定宽度的勾边,勾边的宽度可以通过将顶点沿法线外移的距离来控制。
优点:
模型多绘制一遍,消耗较小,简单粗暴。
缺点:
1、因为与模型表面法线相关,所以对于片儿的边缘可能会有勾边错误,例如扇子
2、绘制边缘的pass不能写深度且需要检测深度,因此会产生因为渲染顺序导致的遮挡问题。
后处理方法:
在场景绘制结束后,使用特定的shader再次绘制需要勾边的角色一遍到某RenderTarget上,处理此Rendertarget找到模型轮廓边界,并融合到场景中。
找边的方法很多,例如可以对这张图进行边缘检测算法(如Sobel)。或者直接对其做高斯模糊,通过alpha的值来找到编辑并且还能方便的融合到背景(暗黑三)
缺点就是:
增加了时空的消耗:
时间上:一次全屏的绘制,需要勾边的模型多一次绘制。
空间上,需要申请一张全屏大小的RenderTarget。
问题:
第二次绘制模型时是否开启深度检测会有两种不同的效果,均有一些问题:
一、关闭深度检测:
勾出的边不会被深度遮挡,因此不管在什么角度,都可以看到完整的模型的勾边效果:
上图,模型的边界不会被石头挡住
二、开启深度检测:
绘制纯色模型时会被前置的角色或者模型挡住,因此在勾边模型与前置模型的交界处会有勾边。
蜘蛛与草的边界处会有勾边效果
绘制纯色模型时会被前置的角色或者模型挡住,因此在勾边模型与前置模型的交界处会有勾边。
暗黑三中算法类似,例如暗黑中被模型挡住的门的勾边效果:(为方便查看,勾了粗边)。
暗黑中被角色遮挡的门的勾边
总结一下一般游戏中3D模型各种勾边方法遇到的工程性问题的更多相关文章
- XNA 中3D模型的显示
XNA 中3D模型的显示: ModelMeshPart[] meshParts; Model start_model; Matrix[] dq_model_transforms; Matrix vie ...
- Chem 3D模型的参数值更改方法
在化学绘图软件ChemOffice 15.1中有个专门用于绘制三维结构的组件,就是Chem 3D.通过这个组件用户可以绘制3D模型并可以通过这个组件来计算一些化学数据.在使用Chem 3D组件过程中, ...
- WPF 3D模型的一个扩展方法
原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...
- 图形与游戏中3D数学基础的说明
1.左手坐标系与右手坐标系没有好坏之分,不同的研究领域和不同的背景下,选择不同的坐标系:传统计算机图形学采用“左手坐标系”,线性代数则倾向于使用右手坐标系 坐标系由坐标轴与坐标原点组成.原点定义坐标系 ...
- Unity导入3D模型的过程与方法
一.介绍 资源是游戏开发中的原材料,也就是组成游戏的模块. Unity只是一个游戏开发引擎,而并不是一个资源开发软件.这就意味着在游戏中需要的资源通常是由一些设计者使用其他软件开发出来的,然后设计者会 ...
- 关于PCB 3D 模型的快速导入方法
altium designer中创建的3D library 只能查看3D效果,并没有其他功能,经测试在原理图编辑界面通过给元件添加 PCB 3D 并不能真正添加3D模型,这样添加根本没有效果(显示不出 ...
- 3D游戏中各种空间变换到底是怎么回事
每一个游戏可以呈现炫丽效果的背后,需要进行一系列的复杂计算,同时也伴随着各种各样的顶点空间变换.渲染游戏的过程可以理解成是把一个个顶点经过层层处理最终转化到屏幕上的过程,本文就旨在说明,顶点是经过了哪 ...
- OpenGl 导入读取多个3D模型 并且添加鼠标控制移动旋转
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11627508.html 前言: 因为接下来的项目需求是要读取多个3D模型,并且移动拼接,那么我 ...
- c# winform用sharpGL(OpenGl)解析读取3D模型obj
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11783026.html 自己写了个简单的类读取解析obj模型,使用导入类,然后new个对象,在 ...
随机推荐
- android menu的问题
1.简单使用 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.me ...
- 【SSM 2】spring常用注解
声明:以下观点,纯依据个人目前的经验和理解,有不当之处,多指教! 一.基本概述 注解(Annotation):也叫元数据.一种代码级别的说明.它是JDK1.5及以后版本引入的一个特性,与类.接口.枚举 ...
- QlikView TEXT控件固定显示图片
QlikView 的Text控件不仅可以用来展示文本也可以用来展示图片. 数据表 2个列,一个是 关联字段(Country),另外一个保存图片物理路径. TEXT控件固定显示图片 ,编辑控件表达式 = ...
- 关键字static和this
1.this关键字 this:代表当前对象,就是代表所在函数所属类的引用.哪个对象调用了this所在的函数,this就代表哪个对象. this关键字也可以用于在构造函数中调用其他构造函数,此时要注意, ...
- JavaScript执行bat文件清理浏览器缓存
function exec() { window.onerror = function (err) { if (err.indexOf('utomation') != -1) { alert('命令已 ...
- 一步一步搭建Jenkins环境
Jenkins使用经验谈1(一步一步搭建Jenkins环境)在公司使用 Jenkins 软件已经有一段时间了,走了很多弯路,但也积累了一些经验,可以和大家分享一下.我们来一起搭建Jenkins环境.首 ...
- 《Linux内核设计与实现》读书笔记 第二章 从内核出发
一.获取内核源码 1. Git git实际上是一种开源的分布式版本控制工具. Linux作为一个开源的内核,其源代码也可以用git下载和管理 - 获取最新提交到版本树的一个副本 - $ git clo ...
- java线程的理解
java thread类都是native方法实现的,所以没有用平台无关的方法实现,怎么实现的呢? 线程的实现: 第一种:使用内核线程实现. 内核线程就是直接使用操作系统内核支持的线程,由内核完成切换. ...
- (转)MVC,MVP 和 MVVM 的图示
作者: 阮一峰 日期: 2015年2月 1日 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身 ...
- Selenium2+python自动化6-八种元素元素定位(Firebug和firepath)
前言 自动化只要掌握四步操作:获取元素,操作元素,获取返回结果,断言(返回结果与期望结果是否一致),最后自动出测试报告.本篇主要讲如何用firefox辅助工具进行元素定位. 元素定位在这四个环节中是至 ...