Example_CelShading.cg
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. /* Cel shading vertex program for single-pass rendering
  2.    In this program, we want to calculate the diffuse and specular
  3.    ramp components, and the edge factor (for doing simple outlining)
  4.    For the outlining to look good, we need a pretty well curved model.
  5. */
  6. void main_vp(float4 position : POSITION,
  7.  float3 normal : NORMAL,
  8.  // outputs
  9.  out float4 oPosition : POSITION,
  10.  out float  diffuse  : TEXCOORD0,
  11.  out float  specular  : TEXCOORD1,
  12.  out float  edge  : TEXCOORD2,
  13.  // parameters
  14.  uniform float3 lightPosition, // object space
  15.  uniform float3 eyePosition,   // object space
  16.  uniform float4  shininess,
  17.  uniform float4x4 worldViewProj)
  18. {
  19. // calculate output position
  20. oPosition = mul(worldViewProj, position);
  21. // calculate light vector
  22. float3 N = normalize(normal);
  23. float3 L = normalize(lightPosition - position.xyz);
  24. // Calculate diffuse component
  25. diffuse = max(dot(N, L) , 0);
  26. // Calculate specular component
  27. float3 E = normalize(eyePosition - position.xyz);
  28. float3 H = normalize(L + E);
  29. specular = pow(max(dot(N, H), 0), shininess);
  30. // Mask off specular if diffuse is 0
  31. if (diffuse == 0) specular = 0;
  32. // Edge detection, dot eye and normal vectors
  33. edge = max(dot(N, E), 0);
  34. }
  35. void main_fp(float diffuseIn  : TEXCOORD0,
  36.  float specularIn : TEXCOORD1,
  37.  float edge : TEXCOORD2,
  38.  
  39.  out float4 colour : COLOR,
  40.  
  41.  uniform float4 diffuse,
  42.  uniform float4 specular,
  43.  
  44.  uniform sampler1D diffuseRamp,
  45.  uniform sampler1D specularRamp,
  46.  uniform sampler1D edgeRamp)
  47. {
  48. // Step functions from textures
  49. diffuseIn = tex1D(diffuseRamp, diffuseIn).x;
  50. specularIn = tex1D(specularRamp, specularIn).x;
  51. edge = tex1D(edgeRamp, edge).x;
  52. colour = edge * ((diffuse * diffuseIn) + 
  53. (specular * specularIn));
  54. }
  55.  
  56.