12 第1页 | 共2 页下一页
返回列表 发新帖
查看: 4082|回复: 15
打印 上一主题 下一主题

一个显示物体截面的效果shader

[复制链接]

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

跳转到指定楼层
楼主
发表于 2011-9-2 08:21:46 |只看该作者 |倒序浏览
这个shader做讲解时可以用的到,可以方便的将物体以截面形式显示。

看下效果:

这个
下面是代码:
// 2 Pass Edition
Shader "cross_section_v004a"
{
Properties
{
section_depth ("section depth (x, y, z, depth)", vector) = (0,0,0,0.15)
section_color ("section color", color) = (0.5,0.1, 0.1, 1)

color_map ("color map", 2D) = "white" {}

}
SubShader
{
Pass
{
CULL OFF

CGPROGRAM //--------------
//#pragma target 3.0
#pragma vertex vertex_shader
#pragma fragment fragment_shader

#include "UnityCG.cginc"

uniform float4 section_depth;
uniform float4 section_color;
uniform sampler2D color_map;

float4x4 rotate(float3 r)
{
float3 c, s;
sincos(r.x, s.x, c.x);
sincos(r.y, s.y, c.y);
sincos(r.z, s.z, c.z);
return float4x4( c.y*c.z, -s.z,     s.y, 0,
s.z, c.x*c.z,    -s.x, 0,
-s.y,     s.x, c.x*c.y, 0,
  0,       0,       0, 1 );
}

s***ct a2v
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD;
float3 normal : NORMAL;
};

s***ct v2f
{
float4 position : POSITION;
float2 texcoord : TEXCOORD0;
float4 normal : TEXCOORD1;
float4 vertex : TEXCOORD2;
float4 mask : TEXCOORD3;
};

v2f vertex_shader( a2v IN )
{
v2f OUT;

float4x4 r = rotate(radians(section_depth.xyz) +_SinTime.xyz);
float4 c = float4(IN.vertex.xyz,1);

OUT.mask = mul(r, c);
OUT.position = mul(glstate.matrix.mvp, IN.vertex);
OUT.texcoord = IN.texcoord;

r *= float4x4( 1,-1,-1, 0,
-1, 1,-1, 0,
-1,-1, 1, 0,
0, 0, 0, 1 ); // the section_depth.xyz need to be inverted !

OUT.normal   = mul(r, float4(1,0,0,1));
OUT.vertex = IN.vertex;

return OUT;
}

void fragment_shader( v2f IN,
out float4 finalcolor : COLOR)

{
if(IN.mask.x > section_depth.w)
discard;

float3 N = IN.normal.xyz;

N = mul(glstate.matrix.invtrans.modelview[0], float4(N, 1));
float diffuse = saturate(dot(glstate.light[0].position, N));

finalcolor = float4(0,0,0,1);
finalcolor.xyz = section_color *(diffuse *0.6 +0.4);
}
ENDCG //--------------

} // Pass

//---------------------------------------------------------------------------------

Pass
{
CULL BACK

CGPROGRAM //--------------
#pragma vertex vertex_shader
#pragma fragment fragment_shader

#include "UnityCG.cginc"

uniform float4 section_depth;
uniform float4 section_color;
uniform sampler2D color_map;

float4x4 rotate(float3 r)
{
float3 c, s;
sincos(r.x, s.x, c.x);
sincos(r.y, s.y, c.y);
sincos(r.z, s.z, c.z);
return float4x4( c.y*c.z, -s.z,     s.y, 0,
s.z, c.x*c.z,    -s.x, 0,
-s.y,     s.x, c.x*c.y, 0,
  0,       0,       0, 1 );
}

s***ct a2v
{
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD;
float3 normal : NORMAL;
};

s***ct v2f
{
float4 position : POSITION;
float2 texcoord : TEXCOORD0;
float3 normal : TEXCOORD1;
float4 vertex : TEXCOORD2;
float4 mask : TEXCOORD3;
};

v2f vertex_shader( a2v IN )
{
v2f OUT;

float4x4 r = rotate(radians(section_depth.xyz) +_SinTime.xyz);
float4 c = float4(IN.vertex.xyz,1);

OUT.mask = mul(r, c);
OUT.position = mul(glstate.matrix.mvp, IN.vertex);
OUT.texcoord = IN.texcoord;
OUT.normal   = IN.normal;
OUT.vertex = IN.vertex;

return OUT;
}

void fragment_shader( v2f IN,
out float4 finalcolor : COLOR)

{
if(IN.mask.x > section_depth.w)
discard;

float3 N = IN.normal;

N = mul(glstate.matrix.invtrans.modelview[0], float4(N, 1));
float diffuse = saturate(dot(glstate.light[0].position, N));

finalcolor = float4(0,0,0,1);
finalcolor.xyz = tex2D(color_map, IN.texcoord).xyz *(diffuse *0.6 +0.4);
}
ENDCG //--------------

} // Pass

} // SubShader
} // Shader
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

1274

主题

1

听众

4万

积分

禁止发言

纳金币
43676
精华
4
沙发
发表于 2011-9-3 08:01:54 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

板凳
发表于 2012-2-14 23:21:20 |只看该作者
有意思!学习了!
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

地板
发表于 2012-4-14 23:26:04 |只看该作者
真不错,全存下来了.
回复

使用道具 举报

462

主题

1

听众

31万

积分

首席设计师

Rank: 8Rank: 8

纳金币
2
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

5#
发表于 2012-6-28 23:24:52 |只看该作者
响应天帅号召,顶
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

6#
发表于 2012-7-24 23:24:15 |只看该作者
好可爱的字,学习了
回复

使用道具 举报

5969

主题

1

听众

39万

积分

首席设计师

Rank: 8Rank: 8

纳金币
-1
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

7#
发表于 2012-8-8 23:55:33 |只看该作者
已阵亡的 蝶 随 风 舞 说过  偶尔按一下 CTRL A 会发现 世界还有另一面
回复

使用道具 举报

1023

主题

3

听众

359

积分

设计实习生

Rank: 2

纳金币
335582
精华
0

最佳新人

8#
发表于 2012-8-10 00:07:00 |只看该作者
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

9#
发表于 2012-9-22 23:27:34 |只看该作者
好`我顶``顶顶
回复

使用道具 举报

   

671

主题

1

听众

3247

积分

中级设计师

Rank: 5Rank: 5

纳金币
324742
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

10#
发表于 2012-9-28 23:18:30 |只看该作者
再看一看,再顶楼主
回复

使用道具 举报

12 第1页 | 共2 页下一页
返回列表 发新帖
您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-8-1 20:12 , Processed in 0.063739 second(s), 29 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部