Qt 3D的研究(六):Toon Shader

原创 2015年03月05日 16:00:37

Qt 3D的研究(六):Toon Shader

       在上次的实验中,我们实现了Gooch Shader,并给出了通过调色板进行个性化的Gooch Shader设置。Toon Shader又称Cell Shader,是以离散的颜色来表示光照的强弱。很多动画片的渲染方式都是使用Toon Shader的。下面这样图就可以使用Toon Shader实现。

蒋彩阳原创文章,首发地址:http://blog.csdn.net/gamesdev/article/details/44084021。欢迎同行前来探讨。


       下面是Toon Shader的代码:

// Toon.vert
#version 100

// Qt 3D默认提供的参数
attribute vec3 vertexPosition;
attribute vec3 vertexNormal;
uniform mat4 modelView;
uniform mat4 modelNormalMatrix;
uniform mat4 mvp;

// 自己提供的参数
uniform vec3 lightPosition;
varying vec3 reflectVec;
varying vec3 viewVec;
varying float NdotL;

void main( void )
{
    vec3 ecPos = ( modelView * vec4( vertexPosition, 1.0 ) ).xyz;
    vec3 normal = normalize( modelNormalMatrix * vec4( vertexNormal, 1.0 ) ).xyz;
    vec3 lightVec = normalize( lightPosition - ecPos );
    reflectVec = normalize( reflect( -lightVec, normal ) );
    viewVec = normalize( -ecPos );
    NdotL = ( dot( lightVec, normal ) + 1.0 ) * 0.5;

    gl_Position = mvp * vec4( vertexPosition, 1.0 );
}
// Toon.frag
#version 100

// 自己提供的参数
varying vec3 reflectVec;
varying vec3 viewVec;
varying float NdotL;
uniform sampler2D texPalette;

float grayTexture( vec4 color )
{
    return dot( color.xyz, vec3( 0.299, 0.587, 0.114 ) );
}

void main( void )
{
    gl_FragColor = texture2D( texPalette, vec2( NdotL, 1.0 ) );
}

我们使用的离散纹理如下所示:

       程序运行结果如下所示:

Qt 3D的研究(一)

Qt 3D是有可能即将在Qt 5.5中正式启用的模块之一。它建立的目标是能够让开发者快速地创建3D场景,通过各式各样的渲染技术来达到3D交互的场景。Qt3D除了和Qt一样跨平台之外,还能够选择Open...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年02月13日 20:45
  • 8031

qwtplot3d(用Qt和OpenGL实现的Qt控件库,3D的,震撼死了)

  • 2009年03月08日 16:12
  • 848KB
  • 下载

【Unity】Unity自带卡通shader(toon shader)分析(一)

Unity Standard Assets中自带4个卡通相关的shader,可以通过导入Effects Package导入: 然后我们可以在Assets->Standard Assets/Eff...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2017年06月18日 23:41
  • 1173

UnityShader实例05:Toon(卡通)材质

卡通材质 卡通着色也叫Non-photorealisticrendering非真实渲染,通常一些3D游戏用来做一些卡通风格的游戏,一般来说特点主要有两点,一是描边,二是风格化着色,表现为明暗渐变过...
  • u011047171
  • u011047171
  • 2015年07月02日 10:53
  • 7827

Qt 3D的研究(五):Gooch Shader

Qt 3D的一个很大的优势就是采用数据驱动的方式,将C++和GLSL使用QML来表示,动态语言的优势尽显。在上一次的研究中,我实现了一个非常简单的着色器,接下来,我们可以在此基础上,通过设定着色器的数...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2015年03月01日 22:58
  • 2757

Shader toon 卡通效果

主要是两点 1.采用Ramp map改变光照为阶梯强弱效果(各种效果自己尝试) 2.描边 这种shader unity有自...
  • baidu_16312167
  • baidu_16312167
  • 2017年07月20日 14:21
  • 210

Unity自带Shader(一)(卡通着色)

前言:最近有必要系统的学习下shader了,虽然平时也用着,原理什么的都懂,而且觉得应用层的shader特别简单,真的难的是隐藏在shader后面的算法,这里准备了一个系列,这个系列是对unity 标...
  • pdw_jsp
  • pdw_jsp
  • 2017年01月07日 15:12
  • 2415

通过卡通渲染描边shader来学习Unity的Shader写法

Unity自带了很多shader,其中就包含卡通渲染和描边的shader。但是我在实际开发游戏的过程中还是遇到了这些shader无法解决的问题。         于是,我们需要理解如何写Unity的...
  • langresser
  • langresser
  • 2014年03月31日 23:10
  • 5744

【Unity3D Shader编程】之四 热带雨林篇: 剔除、深度测试、Alpha测试以及基本雾效合辑

本文介绍了Unity中Shader书写中会用到的剔除、深度测试、Alpha测试以及基本雾效相关的语法知识,然后以6个Shader的书写作为实战内容,最后创建了一个生机勃勃的热带雨林场景进行了Shade...
  • zhmxy555
  • zhmxy555
  • 2014年12月14日 16:49
  • 28675

【OpenGL】Shader实例分析(六)- 卡牌特效

本文将介绍怎么通过alpha通道来隐藏信息,并实现卡牌特效;本文的核心是,利用图片的alpha通道来隐藏信息,达到节省资源的效果...
  • stalendp
  • stalendp
  • 2014年06月15日 15:44
  • 12421
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 3D的研究(六):Toon Shader
举报原因:
原因补充:

(最多只允许输入30个字)