cocos2dx 增长了材料系统,由于以前我深刻研究过RenderMonkey这个软件,又深刻学习了OpenGl es2.0,因此理解起来仍是挺轻松的。可是有些写法仍是不太同样,因此在这里记下,和你们分享一下。学习
首先,咱们先看一个material:spa
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_ES precision mediump float; #endif uniform 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; }