/*********************************************************************NVMH3**** Path: NVSDK\Common\media\cgfx1.4 File: goochy.cgfx Copyright NVIDIA Corporation 2002 TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THIS SOFTWARE IS PROVIDED *AS IS* AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. Comments: Gooch style diffuse texturing, calculated per-vertex ******************************************************************************/ string category = "Effects\\Cg\\NPR"; string keywords = "NPR, pointlight"; string description = "Gooch diffuse surface"; //////////////////// float4x4 WorldITXf : WorldInverseTranspose; float4x4 WorldViewProjXf : WorldViewProjection; float4x4 WorldXf : World; ///////////////////////////////////////////////// ///////////////////////////////////////////////// ///////////////////////////////////////////////// float3 LiteColor : Diffuse < string UIName = "Bright Surface Color"; string UIWidget = "Color"; > = {0.8f, 0.5f, 0.1f}; float3 DarkColor : Diffuse < string UIName = "Dark Surface Color"; string UIWidget = "Color"; > = {0.0f, 0.0f, 0.0f}; float3 WarmColor : Diffuse < string UIName = "Gooch warm tone"; string UIWidget = "Color"; > = {0.5f, 0.4f, 0.05f}; float3 CoolColor : Diffuse < string UIName = "Gooch cool tone"; string UIWidget = "Color"; > = {0.05f, 0.05f, 0.6f}; float4 LightPos : Position < string Object = "PointLight"; string UIName = "Lamp Position"; string Space = "World"; > = {100.0f, 100.0f, 100.0f, 0.0f}; ///////////////////////////////////////////////// /// structures ////////////////////////////////// ///////////////////////////////////////////////// struct appdata { float3 Position : POSITION; float4 Normal : NORMAL; }; struct vertexOutput { float4 HPosition : POSITION; float4 diffCol : COLOR0; }; ///////////////////////////////////////////////// // Shaders ////////////////////////////////////// ///////////////////////////////////////////////// vertexOutput goochVS(appdata IN) { vertexOutput OUT; float3 Nn = normalize(mul(WorldITXf, IN.Normal).xyz); float4 Po = float4(IN.Position.xyz,1); //compute worldspace position float3 Pw = mul(WorldXf, Po).xyz; float3 Ln = normalize(LightPos - Pw).xyz; float mixer = 0.5 * (dot(Ln,Nn) + 1.0); float3 surfColor = lerp(DarkColor,LiteColor,mixer); float3 toneColor = lerp(CoolColor,WarmColor,mixer); float3 mixColor = surfColor + toneColor; OUT.diffCol = float4(mixColor.xyz,1.0f); OUT.HPosition = mul(WorldViewProjXf ,Po); return OUT; } float4 passThruFS(vertexOutput IN) : COLOR { return IN.diffCol; } ///////////////////////////////////////////////// /// Techniques ////////////////////////////////// ///////////////////////////////////////////////// technique PixelShaderVersion { pass { DepthTestEnable = true; DepthFunc = LEqual; VertexProgram = compile arbvp1 goochVS(); FragmentProgram = compile arbfp1 passThruFS(); // somewhat gratuitous } } ///////////////////////////////////////////////// ///////////////////////////////////////// eof /// /////////////////////////////////////////////////