[8708] | 1 | /*********************************************************************NVMH3**** |
---|
| 2 | $Revision$ |
---|
| 3 | |
---|
| 4 | Copyright NVIDIA Corporation 2007 |
---|
| 5 | TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED |
---|
| 6 | *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS |
---|
| 7 | OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY |
---|
| 8 | AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS |
---|
| 9 | BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES |
---|
| 10 | WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, |
---|
| 11 | BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY |
---|
| 12 | LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF |
---|
| 13 | NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. |
---|
| 14 | |
---|
| 15 | |
---|
| 16 | To learn more about shading, shaders, and to bounce ideas off other shader |
---|
| 17 | authors and users, visit the NVIDIA Shader Library Forums at: |
---|
| 18 | |
---|
| 19 | http://developer.nvidia.com/forums/ |
---|
| 20 | |
---|
| 21 | ******************************************************************************/ |
---|
| 22 | |
---|
| 23 | // #define FLIP_TEXTURE_Y |
---|
| 24 | |
---|
| 25 | float Script : STANDARDSGLOBAL < |
---|
| 26 | string UIWidget = "none"; |
---|
| 27 | string ScriptClass = "object"; |
---|
| 28 | string ScriptOrder = "standard"; |
---|
| 29 | string ScriptOutput = "color"; |
---|
| 30 | string Script = "Technique=Main;"; |
---|
| 31 | > = 0.8; |
---|
| 32 | |
---|
| 33 | //// UN-TWEAKABLES - AUTOMATICALLY-TRACKED TRANSFORMS //////////////// |
---|
| 34 | |
---|
| 35 | float4x4 WorldITXf : WorldInverseTranspose < string UIWidget="None"; >; |
---|
| 36 | float4x4 WvpXf : WorldViewProjection < string UIWidget="None"; >; |
---|
| 37 | float4x4 WorldXf : World < string UIWidget="None"; >; |
---|
| 38 | float4x4 ViewIXf : ViewInverse < string UIWidget="None"; >; |
---|
| 39 | |
---|
| 40 | //// TWEAKABLE PARAMETERS //////////////////// |
---|
| 41 | |
---|
| 42 | /// Point Lamp 0 //////////// |
---|
| 43 | float3 Lamp0Pos : Position < |
---|
| 44 | string Object = "PointLight0"; |
---|
| 45 | string UIName = "Lamp 0 Position"; |
---|
| 46 | string Space = "World"; |
---|
| 47 | > = {-0.5f,2.0f,1.25f}; |
---|
| 48 | float3 Lamp0Color : Specular < |
---|
| 49 | string UIName = "Lamp 0"; |
---|
| 50 | string Object = "Pointlight0"; |
---|
| 51 | string UIWidget = "Color"; |
---|
| 52 | > = {1.0f,1.0f,1.0f}; |
---|
| 53 | |
---|
| 54 | // Ambient Light |
---|
| 55 | float3 AmbiColor : Ambient < |
---|
| 56 | string UIName = "Ambient Light"; |
---|
| 57 | string UIWidget = "Color"; |
---|
| 58 | > = {0.07f,0.07f,0.07f}; |
---|
| 59 | |
---|
| 60 | float Ks < |
---|
| 61 | string UIWidget = "slider"; |
---|
| 62 | float UIMin = 0.0; |
---|
| 63 | float UIMax = 1.0; |
---|
| 64 | float UIStep = 0.05; |
---|
| 65 | string UIName = "Specular"; |
---|
| 66 | > = 0.4; |
---|
| 67 | |
---|
| 68 | float Eccentricity < |
---|
| 69 | string UIWidget = "slider"; |
---|
| 70 | float UIMin = 0.0; |
---|
| 71 | float UIMax = 1.0; |
---|
| 72 | float UIStep = 0.0001; |
---|
| 73 | string UIName = "Highlight Eccentricity"; |
---|
| 74 | > = 0.3; |
---|
| 75 | |
---|
| 76 | |
---|
| 77 | //////// COLOR & TEXTURE ///////////////////// |
---|
| 78 | |
---|
| 79 | texture ColorTexture < |
---|
| 80 | string ResourceName = "default_color.dds"; |
---|
| 81 | string UIName = "Diffuse Texture"; |
---|
| 82 | string ResourceType = "2D"; |
---|
| 83 | >; |
---|
| 84 | |
---|
| 85 | sampler2D ColorSampler = sampler_state { |
---|
| 86 | Texture = <ColorTexture>; |
---|
| 87 | MinFilter = LinearMipMapLinear; |
---|
| 88 | MagFilter = Linear; |
---|
| 89 | WrapS = Repeat; |
---|
| 90 | WrapT = Repeat; |
---|
| 91 | }; |
---|
| 92 | |
---|
| 93 | // |
---|
| 94 | // #define this macro to permit the import and use of shared shadow |
---|
| 95 | // maps created by COLLADA-FX. Make sure that the macro is defined |
---|
| 96 | // and the code recompile *before* executing "Convert to Collada-FX"! |
---|
| 97 | // |
---|
| 98 | // #define USE_SHARED_SHADOW |
---|
| 99 | |
---|
| 100 | #ifdef USE_SHARED_SHADOW |
---|
| 101 | #include "include/shadowMap.cgh" |
---|
| 102 | DECLARE_SHADOW_XFORMS("SpotLight0",LampViewXf,LampProjXf,ShadowViewProjXf) |
---|
| 103 | DECLARE_SHADOW_BIAS |
---|
| 104 | DECLARE_SHADOW_MAPS(ColorShadTarget,ColorShadSampler,DepthShadTarget,DepthShadSampler) |
---|
| 105 | |
---|
| 106 | float ShadDens < |
---|
| 107 | string UIWidget = "slider"; |
---|
| 108 | float UIMin = 0.0; |
---|
| 109 | float UIMax = 1.0; |
---|
| 110 | float UIStep = 0.01; |
---|
| 111 | string UIName = "Shadow Density"; |
---|
| 112 | > = 0.7; |
---|
| 113 | #endif /* USE_SHARED_SHADOW */ |
---|
| 114 | |
---|
| 115 | |
---|
| 116 | //////// CONNECTOR DATA STRUCTURES /////////// |
---|
| 117 | |
---|
| 118 | /* data from application vertex buffer */ |
---|
| 119 | struct appdata { |
---|
| 120 | float3 Position : POSITION; |
---|
| 121 | float4 UV : TEXCOORD0; |
---|
| 122 | float4 Normal : NORMAL; |
---|
| 123 | float4 Tangent : TANGENT0; |
---|
| 124 | float4 Binormal : BINORMAL0; |
---|
| 125 | }; |
---|
| 126 | |
---|
| 127 | /* data passed from vertex shader to pixel shader */ |
---|
| 128 | struct vertexOutput { |
---|
| 129 | float4 HPosition : POSITION; |
---|
| 130 | float2 UV : TEXCOORD0; |
---|
| 131 | // The following values are passed in "World" coordinates since |
---|
| 132 | // it tends to be the most flexible and easy for handling |
---|
| 133 | // reflections, sky lighting, and other "global" effects. |
---|
| 134 | float3 LightVec : TEXCOORD1; |
---|
| 135 | float3 WorldNormal : TEXCOORD2; |
---|
| 136 | float3 WorldTangent : TEXCOORD3; |
---|
| 137 | float3 WorldBinormal : TEXCOORD4; |
---|
| 138 | float3 WorldView : TEXCOORD5; |
---|
| 139 | #ifdef USE_SHARED_SHADOW |
---|
| 140 | // This optional value expresses the current location in "light" |
---|
| 141 | // coordinates for use with shadow mapping. |
---|
| 142 | float4 LProj : LPROJ_COORD; |
---|
| 143 | #endif /* USE_SHARED_SHADOW */ |
---|
| 144 | }; |
---|
| 145 | |
---|
| 146 | ///////// VERTEX SHADING ///////////////////// |
---|
| 147 | |
---|
| 148 | /*********** Generic Vertex Shader ******/ |
---|
| 149 | |
---|
| 150 | vertexOutput std_VS(appdata IN) { |
---|
| 151 | vertexOutput OUT = (vertexOutput)0; |
---|
| 152 | OUT.WorldNormal = mul(WorldITXf,IN.Normal).xyz; |
---|
| 153 | OUT.WorldTangent = mul(WorldITXf,IN.Tangent).xyz; |
---|
| 154 | OUT.WorldBinormal = mul(WorldITXf,IN.Binormal).xyz; |
---|
| 155 | float4 Po = float4(IN.Position.xyz,1); |
---|
| 156 | float3 Pw = mul(WorldXf,Po).xyz; |
---|
| 157 | OUT.LightVec = (Lamp0Pos - Pw); |
---|
| 158 | #ifdef FLIP_TEXTURE_Y |
---|
| 159 | OUT.UV = float2(IN.UV.x,(1.0-IN.UV.y)); |
---|
| 160 | #else /* !FLIP_TEXTURE_Y */ |
---|
| 161 | OUT.UV = IN.UV.xy; |
---|
| 162 | #endif /* !FLIP_TEXTURE_Y */ |
---|
| 163 | #ifdef USE_SHARED_SHADOW |
---|
| 164 | float4 Pl = mul(ShadowViewProjXf,Pw); // "P" in light coords |
---|
| 165 | float4x4 BiasXf = make_bias_mat(ShadBias); |
---|
| 166 | OUT.LProj = mul(BiasXf,Pl); // bias to make texcoord |
---|
| 167 | #endif /* USE_SHARED_SHADOW */ |
---|
| 168 | OUT.WorldView = normalize(float3(ViewIXf[0].w,ViewIXf[1].w,ViewIXf[2].w) - Pw); |
---|
| 169 | OUT.HPosition = mul(WvpXf,Po); |
---|
| 170 | return OUT; |
---|
| 171 | } |
---|
| 172 | |
---|
| 173 | ///////// PIXEL SHADING ////////////////////// |
---|
| 174 | |
---|
| 175 | // Utility function for blinn shading |
---|
| 176 | |
---|
| 177 | void blinn_shading(vertexOutput IN, |
---|
| 178 | float3 LightColor, |
---|
| 179 | float3 Nn, |
---|
| 180 | float3 Ln, |
---|
| 181 | float3 Vn, |
---|
| 182 | out float3 DiffuseContrib, |
---|
| 183 | out float3 SpecularContrib) |
---|
| 184 | { |
---|
| 185 | float3 Hn = normalize(Vn + Ln); |
---|
| 186 | float hdn = dot(Hn,Nn); |
---|
| 187 | float3 R = reflect(-Ln,Nn); |
---|
| 188 | float rdv = dot(R,Vn); |
---|
| 189 | rdv = max(rdv,0.001); |
---|
| 190 | float ldn=dot(Ln,Nn); |
---|
| 191 | ldn = max(ldn,0.0); |
---|
| 192 | float ndv = dot(Nn,Vn); |
---|
| 193 | float hdv = dot(Hn,Vn); |
---|
| 194 | float eSq = Eccentricity*Eccentricity; |
---|
| 195 | float distrib = eSq / (rdv * rdv * (eSq - 1.0) + 1.0); |
---|
| 196 | distrib = distrib * distrib; |
---|
| 197 | float Gb = 2.0 * hdn * ndv / hdv; |
---|
| 198 | float Gc = 2.0 * hdn * ldn / hdv; |
---|
| 199 | float Ga = min(1.0,min(Gb,Gc)); |
---|
| 200 | float fresnelHack = 1.0 - pow(ndv,5.0); |
---|
| 201 | hdn = distrib * Ga * fresnelHack / ndv; |
---|
| 202 | DiffuseContrib = ldn * LightColor; |
---|
| 203 | SpecularContrib = hdn * Ks * LightColor; |
---|
| 204 | } |
---|
| 205 | |
---|
| 206 | float4 std_PS(vertexOutput IN) : COLOR { |
---|
| 207 | float3 diffContrib; |
---|
| 208 | float3 specContrib; |
---|
| 209 | float3 Ln = normalize(IN.LightVec); |
---|
| 210 | float3 Vn = normalize(IN.WorldView); |
---|
| 211 | float3 Nn = normalize(IN.WorldNormal); |
---|
| 212 | blinn_shading(IN,Lamp0Color,Nn,Ln,Vn,diffContrib,specContrib); |
---|
| 213 | float3 diffuseColor = tex2D(ColorSampler,IN.UV).rgb; |
---|
| 214 | #ifdef USE_SHARED_SHADOW |
---|
| 215 | float shadowed = tex2Dproj(DepthShadSampler,IN.LProj).x; |
---|
| 216 | float faded = 1.0-(ShadDens*(1.0-shadowed)); |
---|
| 217 | diffContrib *= faded; |
---|
| 218 | specContrib *= shadowed; |
---|
| 219 | #endif /* USE_SHARED_SHADOW */ |
---|
| 220 | float3 result = specContrib+(diffuseColor*(diffContrib+AmbiColor)); |
---|
| 221 | // return as float4 |
---|
| 222 | return float4(result,1); |
---|
| 223 | } |
---|
| 224 | |
---|
| 225 | ///// TECHNIQUES ///////////////////////////// |
---|
| 226 | |
---|
| 227 | technique Main < |
---|
| 228 | string Script = "Pass=p0;"; |
---|
| 229 | > { |
---|
| 230 | pass p0 < |
---|
| 231 | string Script = "Draw=geometry;"; |
---|
| 232 | > { |
---|
| 233 | VertexProgram = compile vp40 std_VS(); |
---|
| 234 | DepthTestEnable = true; |
---|
| 235 | DepthMask = true; |
---|
| 236 | CullFaceEnable = false; |
---|
| 237 | BlendEnable = false; |
---|
| 238 | DepthFunc = LEqual; |
---|
| 239 | FragmentProgram = compile fp40 std_PS(); |
---|
| 240 | } |
---|
| 241 | } |
---|
| 242 | |
---|
| 243 | /////////////////////////////////////// eof // |
---|