卡通着色效果

一、简单介绍

虽然自己学的都比较浅,但是还是想通过文字来记录下。首先先介绍下卡通着色的效果,为什么要进行卡通着色,卡通着色的目的就是为了让被着色物体显得过渡的不要那么的好,明暗交界线很明显。卡通着色也叫做非真实渲染技术,利用卡通着色加上描黑边的效果就可以很好的做出一个动画的任务了,就比如说下面的一个喜羊羊的图片。颜色都很分明的。


卡通着色将一个一维纹理贴图作为查询表,使用纹理贴图中的纯色去填充几何图形。

二、具体实现

使用漫射光照强度也就是视觉空间表面法线和光线方向向量的点乘积,作为纹理坐标添加到一个包含逐渐变亮的颜色表的一维纹理中。漫射光点乘积的值是从没有强度的0.0到最高强度的1.0之间变化的。

顶点着色器程序如下所示

//传入的顶点
attribute vec4 vVertex;
//传入的法线
attribute vec3 vNormal;
//将要传入的纹理坐标也就是漫反射的强度
varying float textureCoordinate;
//光源位置
uniform vec3    vLightPosition;
//模型视图投影矩阵
uniform mat4    mvpMatrix;
//模型视图矩阵
uniform mat4    mvMatrix;
//法线矩阵
uniform mat3    normalMatrix;


void main()
{
   //首先先把法线转换成视觉坐标系下的
    vec3 vEyeNormal = normalMatrix*vNormal;
    
    //这里要先把顶点转换成视觉坐标下的顶点
    vec4 vPosition4 = mvMatrix * vVertex;
    
    //然后把拥有四个分量的顶点转换成三个顶点的分量
    vec3 vPosition3 = vPosition4.xyz/vPosition4.w;
    
    //然后就是计算经过顶点的光源向量
    vec3 vLightDir = normalize(vLightPosition-vPosition3);
    
    //计算漫反射强度
    textureCoordinate = max(0.0,dot(vEyeNormal,vLightDir));
   
    //最后模型视图矩阵和顶点相乘
    gl_Position = mvpMatrix*vVertex;
  
}

片元着色器代码

//首先需要一个采样器去采样纹理
uniform sampler1D colorMap;

//然后从顶点着色器中传入进来的数据
varying float textureCoordinate;

//然后我们需要一个变量来存储颜色
vec4 vFragColor;

void main()
{
    gl_FragColor = texture1D(colorMap,textureCoordinate);
    
}
效果如下所示,这里就是通过了diffuse的漫反射强度把物体变成了很明显的几个色阶


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值