次表面散射(SubSurface Scattering) Shader 【转】
2014-06-24 18:08
531 查看
原文 http://www.azure.com.cn/article.asp?id=231
用深度值近似模拟物体的厚度,
厚度越小处透光越多。
varying vec4 position;
varying vec4 world_pos;
varying vec2 texcoord0;
varying vec3 normal;
void main(void)
{
gl_Position = ftransform();
world_pos = gl_Position;
position = gl_Vertex;
texcoord0 = gl_MultiTexCoord0.st;
normal = gl_NormalMatrix * gl_Normal;
}
varying vec4 position;
varying vec4 world_pos;
varying vec2 texcoord0;
varying vec3 normal;
uniform vec4 camera_pos;
uniform float near_clip;
uniform float ampify;
uniform vec3 singlelight;
uniform sampler2D base;
uniform vec3 lightcolor;
uniform float ks;
void main(void)
{
float distance =( distance(camera_pos, position) - near_clip )/200.0 * ampify;
distance = log2(distance);
//gl_FragColor = vec4(distance, distance, distance, 1);
vec4 lightpos = vec4(singlelight.x,
singlelight.y,
singlelight.z,
1);
vec4 lightvec = lightpos - position;
normalize(lightvec);
normalize(normal);
float diffuse = max(0.0, dot(normal, lightvec.xyz));
vec4 diffusecolor = vec4(diffuse*lightcolor.r, diffuse*lightcolor.g, diffuse*lightcolor.b, 1.0);
vec3 V = normalize(camera_pos - position).xyz;
vec3 H = normalize(lightvec.xyz + V);
float speclight = pow(max(dot(normal.xyz, H), 0.0), ks);
vec4 specularcolor = vec4(speclight, speclight, speclight, 1.0);
gl_FragColor = texture2D(base, texcoord0) * distance + diffusecolor + specularcolor;
//gl_FragColor.r = distance;
//gl_FragColor = diffusecolor;
}
用深度值近似模拟物体的厚度,
厚度越小处透光越多。
varying vec4 position;
varying vec4 world_pos;
varying vec2 texcoord0;
varying vec3 normal;
void main(void)
{
gl_Position = ftransform();
world_pos = gl_Position;
position = gl_Vertex;
texcoord0 = gl_MultiTexCoord0.st;
normal = gl_NormalMatrix * gl_Normal;
}
varying vec4 position;
varying vec4 world_pos;
varying vec2 texcoord0;
varying vec3 normal;
uniform vec4 camera_pos;
uniform float near_clip;
uniform float ampify;
uniform vec3 singlelight;
uniform sampler2D base;
uniform vec3 lightcolor;
uniform float ks;
void main(void)
{
float distance =( distance(camera_pos, position) - near_clip )/200.0 * ampify;
distance = log2(distance);
//gl_FragColor = vec4(distance, distance, distance, 1);
vec4 lightpos = vec4(singlelight.x,
singlelight.y,
singlelight.z,
1);
vec4 lightvec = lightpos - position;
normalize(lightvec);
normalize(normal);
float diffuse = max(0.0, dot(normal, lightvec.xyz));
vec4 diffusecolor = vec4(diffuse*lightcolor.r, diffuse*lightcolor.g, diffuse*lightcolor.b, 1.0);
vec3 V = normalize(camera_pos - position).xyz;
vec3 H = normalize(lightvec.xyz + V);
float speclight = pow(max(dot(normal.xyz, H), 0.0), ks);
vec4 specularcolor = vec4(speclight, speclight, speclight, 1.0);
gl_FragColor = texture2D(base, texcoord0) * distance + diffusecolor + specularcolor;
//gl_FragColor.r = distance;
//gl_FragColor = diffusecolor;
}
相关文章推荐
- 实现Subsurface Scattering效果(Subsurface Scattering shader by InvalidPointer : Half-Lambert + Fresnel Term)
- 次表面散射(SubSurface Scattering) Shader
- Unity3d shader之次表面散射(Subsurface Scattering)
- Unity3d shader之次表面散射(Subsurface Scattering)
- 表面着色器示例 Surface Shader Examples
- Subsurface Scattering in mental ray
- Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
- Fast Realtime Subsurface Scattering Skin Rendering
- Unity Shaders and Effects Cookbook (1-1) 基本的表面着色器 (Surface Shader)
- Fast Realtime Subsurface Scattering Skin Rendering
- Unity3D - Shader - 表面着色器(Surface Shaders)
- 次表面散射Subsurface Scattering(SSS)
- Unity Shader 学习笔记(29) 表面着色器(Surface Shader)
- unity shader 可编程管线(一) 表面着色器SurfaceShader
- Practise Skin Sub Surface Scattering (SSS) Effect In RenderMan Production
- Realtime Subsurface Scattering Skin Rendering On the GPU 视频
- 【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
- Surface Shader(可编程渲染管线 表面着色器)
- 【浅墨Unity3D Shader编程】之六 暗黑城堡篇: 表面着色器(Surface Shader)的写法(一)
- 表面着色器(Surface Shader)的写法(一)