-
Notifications
You must be signed in to change notification settings - Fork 1
/
bsps.cg
131 lines (106 loc) · 3.55 KB
/
bsps.cg
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
////////////////////////////////////////////////////////////////////
//
// $Id: bsps.cg 2021/06/05 12:10:48 kanai Exp $
//
// Copyright (c) 2021 Takashi Kanai
// Released under the MIT license
//
////////////////////////////////////////////////////////////////////
#include "mydefine.h"
#include "binsearch.cg"
#include "bsps3.cg"
#include "bsps5.cg"
void main( float4 HPOS : POSITION,
float3 Access : TEXCOORD0,
uniform float3 eyePos,
uniform float3 lightPos,
uniform float3 ambientColor,
uniform float3 diffuseColor,
uniform float3 specularColor,
uniform float specularShininess,
uniform float drawMode,
uniform samplerRECT ukvTex,
uniform samplerRECT uknotTex2D,
uniform samplerRECT vkvTex,
uniform samplerRECT vknotTex2D,
uniform samplerRECT cpTex,
uniform sampler2D lightTex,
uniform float4x4 ModelViewProj,
uniform float4x4 ModelViewIT,
out float4 color : COLOR0 )
{
// a two-dimensional parameter + b-spline face id
float u = Access.x;
float v = Access.y;
float fid = round(Access.z * FID_DIV);
float4 cc = texRECT( cpTex, float2(0, fid) );
// evaluate a point and a normal vector
float4 pos;
float4 nrm;
if ( cc.x == BSP_CUBIC )
{
eval3( u,v, fid, ukvTex, uknotTex2D, vkvTex, vknotTex2D, cpTex, pos, nrm );
}
else if ( cc.x == BSP_QUINTIC )
{
// eval5( u,v, fid, ukvTex, uknotTex2D, vkvTex, vknotTex2D, cpTex, pos, nrm );
}
color = float4(.0f, .0f, .0f, 1.0f );
#if 0
//
// $BH?<M@~$N7W;;(B
//
float3 wpos = mul(ModelViewProj, pos).xyz;
float3 wnrm = normalize( mul(ModelViewIT, nrm).xyz );
// 1. $B;kE@$+$iE@$X$N%Y%/%H%k$NH?<M%Y%/%H%k$r5a$a$k(B
// ($B%*%V%8%'%/%H:BI8$K$h$j7W;;(B)
float3 PosEye = wpos - eyePos;
float3 WRef = reflect( PosEye, wnrm );
if(dot(wnrm, float3(0.0, 1.0, 0.0)) < 0.0 ||
dot(wnrm, float3(0.0, 0.0, 1.0)) < 0.0 ||
dot(WRef, float3(0.0, 1.0, 0.0)) < 0.0)
WRef.y = 0.0;
// 2. $BH?<M%Y%/%H%k$HE@$+$i$J$kD>@~$H!$J?LL(B z=Z $B$N8rE@$r5a$a$k(B
float val = (1.0f - wpos.z) / WRef.z;
float2 uv = wpos.xy + WRef.xy * val;
// 2.' uv $B$NCM$r(B [0, 1] $B$K@55,2=(B(-10.0-10.0$B$GDj5A$5$l$k8w8;$rA[Dj(B)
uv = (uv - (-10.0)) * 0.05; // / 20.0
// 3. $B8rE@$r%F%/%9%A%c:BI8$H$7$F%F%/%9%A%c$r%k%C%/%"%C%W$9$k(B
color += 2.0 * f4tex2D( lightTex, uv );
#endif
if ( drawMode == DISPLAY_FRAGGPU )
{
//
// Shading
//
float3 nrm3 = nrm.xyz;
float3 lp = normalize( lightPos );
// calculate half angle vector
float3 halfVec = normalize(lp + eyePos);
// calculate diffuse component
float3 diffuse = max( dot(nrm3, lp), 0.0 ) * diffuseColor;
// calculate specular component
// float3 specularMaterial = float3(0.8, 0.8, 0.8);
float3 specular = float3( max(dot(nrm3, halfVec), 0.0));
specular = pow(specular.x, specularShininess) * specularColor;
// calculate ambient component
// float3 ambient = float3( .2, .2, .2 );
// combine diffuse and specular contributions and output final vertex color
color.xyz += (ambientColor + diffuse + specular);
//color.w += 1.0;
}
else if ( drawMode == DISPLAY_GPUISO )
{
//
// Isophoto
//
float3 lv = lightPos - pos.xyz;
float3 lvn = normalize( lv );
float3 nrm3 = nrm.xyz;
float d = dot( nrm3, lvn ) * 10.0;
if ( (int) fmod( d, 2 ) == 0 )
color += float4( .1f, .1f, .1f, 1.0f );
else
color += float4( .9f, .9f, .9f, 1.0f );
}
}