码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-03-05 17:01:23      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:qt   3d   

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的研究(六):Toon Shader

标签:qt   3d   

原文地址:http://blog.csdn.net/gamesdev/article/details/44084021

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!