unity之自制玻璃啤酒瓶shader
客户的要求如下
步骤:
1.进行玻璃瓶效果分析
效果如下:高光,类次表面散射(里层通透而外层较为暗淡),外层白色勾勒轮廓。
高光:unity内部提供光滑度参数,越光滑则高光效果越明显,啤酒瓶材质是属于光滑,高光明显,可用下面的公式:
o.Smoothness = _Glossiness;
数值可控制在0.9附近。
外层白色轮廓描边:
描边效果很常见,只要获取物体的外边缘再加上自发光系数就可以做个很好的描边效果了
half rim = 1.0 - saturate(dot (normalize(IN.viewDir),IN.worldNormal));
//边缘颜色强度 越大反而越不可见,线条越细
//变浅,每个UV上的RGB*对应的norml与视觉的夹角
o.Emission = _RimColor.rgb * pow (rim, _RimPower);
与视角的范围平行,dot两向量则为1,rim值越小越接近0,垂直,dot两向量为0,rim值越大越接近1。
然后用pow阶乘,放大效果。这个学过极限的话及很容易明白,x-0,则阶乘指数越大则数越小,越趋向于0,反之则越接近于1
次表面散射:光射入非金属材质后再内部发生散射,最后射出物体并进入视野中产生的现象,是指光从表面进入物体经过内部散射,然后又通过物体表面的其他顶点出射的光线传递过程。
而在这里我使用了视觉假象来完成就是在中间的为亮面,边缘的为暗面,直接用两种颜色进行过渡了,核心公式为:
fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
half rim = 1.0 - saturate(dot (normalize(IN.viewDir),IN.worldNormal));
o.Albedo = lerp(_SubColor.rgb, c.rgb, rim);
先算出边缘的数值rim,然后利用rim来进行次表面颜色和主颜色的过度,这样就可以很好的制造出次表面的现象,当然这是一种取巧的做法,貌似还有更好的做法等着我去研究。
路还很远,这次感觉还有很多做的不好的地方,如果有不对的地方欢迎指出,我还是图形学的新手。
unity之自制玻璃啤酒瓶shader的更多相关文章
- 【Unity Shaders】Vertex & Fragment Shader入门
写在前面 三个月以前,在一篇讲卡通风格的Shader的最后,我们说到在Surface Shader中实现描边效果的弊端,也就是只对表面平缓的模型有效.这是因为我们是依赖法线和视角的点乘结果来进行描边判 ...
- [转]解读Unity中的CG编写Shader系列7——漫反射
如果前面几个系列文章的内容过于冗长缺乏趣味着实见谅,由于时间原因前面的混合部分还没有写完,等以后再补充,现在开始关于反射的内容了.折射与反射在物理世界中,光的反射与折射往往是同时存在的,光源由真空或者 ...
- 解读Unity中的CG编写Shader系列七(不透明度与混合)
转自http://www.itnose.net/detail/6098539.html 1.不透明度 当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段 ...
- 解读Unity中的CG编写Shader系列十 (光滑的镜面反射(冯氏着色))
前文完成了最基本的镜面反射着色器,单平行光源下的逐顶点着色(per-vertex lighting),又称为古罗着色(Gouraud shading).这篇文章作为后续讨论更光滑的镜面反射方式,逐像素 ...
- 解读Unity中的CG编写Shader系列八(多光源漫反射)
转自http://www.itnose.net/detail/6117338.html 前文中完成最简单的漫反射shader只是单个光源下的漫反射,而往往场景中不仅仅只有一个光源,那么多个光源的情况下 ...
- 解读Unity中的CG编写Shader系列八(镜面反射)
转自http://www.itnose.net/detail/6117378.html 讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知 ...
- 解读Unity中的CG编写Shader系列三
转自http://www.itnose.net/detail/6096068.html 在上一个例子中,我们得到了由mesh组件传递的信息经过数学转换至合适的颜色区间以颜色的形式着色到物体上.这篇文章 ...
- 解读Unity中的CG编写Shader系列一
转自http://www.itnose.net/detail/6095323.html 前提知识点: 1.CG代码必须用 CGPROGRAM ... ENDCG括起来 2.顶点着色器与片段着色器的主函 ...
- 【Unity Shaders】初探Surface Shader背后的机制
转载请注明出处:http://blog.csdn.net/candycat1992/article/details/39994049 写在前面 一直以来,Unity Surface Shader背后的 ...
随机推荐
- NFR
你NFR了吗? NFR,即非功能性需求 (Non -Functional Requirements) ,即系统能够完成所期望的工作的性能与质量.具体包括如下内容: – 效率: 软件实现其功能所需要的计 ...
- 【极品代码】一般人我不告诉他,手机端h5播放时不自动全屏代码
已测适用于ios,某些安卓手机微信下播放视频会出现播放器控件(这个实在是无力吐槽噢,因为之前还遇到过微信播放完视频后竟然无法退出全屏出现广告的情况,只有播放完后刷新页面并且要放到框架页里才能屏蔽微信视 ...
- Play Framework 项目遇到问题
1.Debug调试出错,提示: Error occurred during initialization of VMagent library failed to init: jdwpERROR: C ...
- docker 基础使用
搜索某个镜像: docker search busybox 拉取: docker pull busybox 查看: docker images 启动并运行: docker run -it b ...
- [转]ubuntu linux下DNS重启后丢失
从网上得知 /etc/resolv.conf中的DNS配置是从/etc/resolvconf/resolv.conf.d/head中加载而来,所以每回改resolv.conf都会失效,在此文件里面已经 ...
- linux基本知识2
date:时间管理 linux时钟: 硬件时钟:hwclock -s:硬件时钟到系统时钟 -w:系统时钟到硬件时钟 系统时钟:date 如何查看是外部命令还是内部命令: type COMMAND ...
- (转)深入理解Java的接口和抽象类
原文地址: http://www.cnblogs.com/dolphin0520/p/3811437.html 对于面向对象编程来说,抽象是它的一大特征之一.在Java中,可以通过两种形式来体现OOP ...
- docker学习(4) 一些常用操作
继续docker的学习之旅,今天练习一些常用的命令: 一.镜像相关 1.1 列出本机所有镜像 docker images 后面的操作,都以ubuntu做为练习的目标. 另外:如果某些镜像文件不想要了, ...
- [LeetCode] Add Two Numbers 两个数字相加
You are given two linked lists representing two non-negative numbers. The digits are stored in rever ...
- Stack的三种含义
作者: 阮一峰 日期: 2013年11月29日 学习编程的时候,经常会看到stack这个词,它的中文名字叫做"栈". 理解这个概念,对于理解程序的运行至关重要.容易混淆的是,这个词 ...