cocos2dx Material System讲解一

来源:互联网 发布:人力资源现状分析知乎 编辑:程序博客网 时间:2024/06/05 07:00

        cocos2dx 增加了材料系统,因为之前我深入研究过RenderMonkey这个软件,又深入学习了OpenGl es2.0,所以理解起来还是挺轻松的。但是有些写法还是不太一样,所以在这里记下,和大家分享一下。

首先,我们先看一个material:

material mf{technique m0   {   pass 0   {       renderState       {           cullFace=true           depthTest=true       }       shader       {           vertexShader=shaders/molecular_formula.vert           fragmentShader=shaders/molecular_formula.frag           u_lightLocation=0,0,0           u_Camera=0,0,0           uColorR=0.1           uColorG=0.6           uColorB=0.9           uColorA=0.0   transparent=0.0       }   }   }   technique m1   {   pass 1   {       renderState       {           cullFace=true           depthTest=true       }       shader       {           vertexShader=shaders/molecular_formula.vert           fragmentShader=shaders/molecular_formula.frag           u_lightLocation=0,0,0           u_Camera=0,0,0           uColorR=0.1           uColorG=0.6           uColorB=0.9           uColorA=1.0   transparent=0.7       }   }   } technique m2   {   pass 2   {       renderState       {           cullFace=true           depthTest=true       }       shader       {           vertexShader=shaders/molecular_formula.vert           fragmentShader=shaders/molecular_formula.frag           u_lightLocation=0,0,-20           u_Camera=0,0,10           uColorR=0.95           uColorG=0.95           uColorB=0.10           uColorA=1.0   transparent=0.7       }   }   }    technique m3   {   pass 3   {       renderState       {           cullFace=true           depthTest=true       }       shader       {           vertexShader=shaders/molecular_formula.vert           fragmentShader=shaders/molecular_formula.frag           u_lightLocation=10,0,-20           u_Camera=0,0,100           uColorR=0.95           uColorG=0.45           uColorB=0.25           uColorA=1.0   transparent=0.7       }   }   }    technique m4   {   pass 1   {       renderState       {           cullFace=true           depthTest=true       }       shader       {           vertexShader=shaders/molecular_formula.vert           fragmentShader=shaders/molecular_formula.frag           u_lightLocation=-100,0,100           u_Camera=100,0,50           uColorR=0.1           uColorG=0.6           uColorB=0.9           uColorA=1.0   transparent=0.7       }   }   }}
molecular_formula.vert

attribute vec4 a_position;attribute vec3 a_normal;attribute vec2 a_texCoord;uniform vec3 u_lightLocation;uniform vec3 u_Camera;varying vec2 v_texture_coord;varying vec4 v_ambient;varying vec4 v_diffuse;varying vec4 v_specular;void pointLight(  in vec3 normal,  inout vec4 ambient,  inout vec4 diffuse,  inout vec4 specular,  in vec3 lightLocation,  in vec4 lightAmbient,  in vec4 lightDiffuse,  in vec4 lightSpecular ){  ambient=lightAmbient;  vec3 normalTarget= a_position.xyz+normal;  vec3 newNormal=(CC_MVMatrix*vec4(normalTarget,1)).xyz-(CC_MVMatrix*a_position).xyz;  newNormal=normalize(newNormal);  vec3 eye=normalize(u_Camera-(CC_MVMatrix*a_position).xyz);  vec3 vp=normalize(lightLocation-(CC_MVMatrix*a_position).xyz);  vp=normalize(vp);  vec3 halfVector=normalize(vp+eye);  float shininess=50.0;  float nDotViewPosition=max(0.0,dot(newNormal,vp));  diffuse=lightDiffuse*nDotViewPosition;  float nDotViewHalfVector=dot(newNormal,halfVector);  float powerFactor=max(0.0,pow(nDotViewHalfVector,shininess));  specular=lightSpecular*powerFactor;  }void main(void){    gl_Position = CC_MVPMatrix * a_position;        vec4 ambientTemp,diffuseTemp,specularTemp;        pointLight(normalize(a_normal),ambientTemp,diffuseTemp,specularTemp,u_lightLocation,    vec4(0.8,0.8,0.8,1.0),vec4(0.8,0.8,0.8,1.0),vec4(0.9,0.9,0.9,1.0));        v_ambient=ambientTemp;    v_diffuse=diffuseTemp;    v_specular=specularTemp;        v_texture_coord = a_texCoord;    v_texture_coord.y = (1.0 - v_texture_coord.y);}
molecular_formula.frag

#ifdef GL_ESprecision mediump float;#endifuniform vec4  u_color;uniform float uColorR;uniform float uColorG;uniform float uColorB;uniform float uColorA;uniform float transparent;varying vec4 v_ambient;varying vec4 v_diffuse;varying vec4 v_specular;void main(void){ vec4 finalColor =vec4(uColorR,uColorG,uColorB,uColorA); vec4 color=finalColor*v_ambient+finalColor*v_diffuse+finalColor*v_specular;     gl_FragColor=color*u_color*transparent;    }

下面是效果图:

未完待续


1 0
原创粉丝点击