论坛改版后一直登陆不了,今天找 南塔斯反馈了一下解决了,喜大普奔,庆祝一下.分享一个干货:
cocos 3D模型的 平面投影 解决方案:
材质:
technique normal_shadow
{
pass normal
{
shader
{
defines = MAX_DIRECTIONAL_LIGHT_NUM 0;MAX_POINT_LIGHT_NUM 0;MAX_SPOT_LIGHT_NUM 0 //define this macro set light work
vertexShader = shaders/3d_position_normal_skin_tex.vert
fragmentShader = shaders/3d_color_normal_tex.frag
}
}
pass shadow
{
renderState
{
cullFace = true
depthTest = true
}
shader
{
defines = MAX_DIRECTIONAL_LIGHT_NUM 0;MAX_POINT_LIGHT_NUM 0;MAX_SPOT_LIGHT_NUM 0 //define this macro set light work
vertexShader = shaders/3d_position_normal_skin_shadow.vert
fragmentShader = shaders/3d_color_normal_shadow.frag
// Uniforms
u_planeNormal = 0.0, 1.0, 0.0//平面法线
u_planeHeight = 0.0//平面高度
u_lightDir = -1.0,-2.0,-1//光线方向
}
}
}
顶点着色器部分代码:
void main()
{
vec4 position;
getPosition(position);//动画运算由GPU处理,此处获取动画中的顶点位置
vec4 ePosition = CC_MVMatrix * position;
///
/// begin Projection Coordinates Transformation
vec4 pos = ePosition;
float t = 0;
//此处基于Nplane为(0,1,0)进行了优化运算,具体运算为对应后面的注释
//t = (Nplane*Pplane - Nplane*p0)/(Nplane*Dir)
float ndd = u_lightDir.y;//dot(u_planeNormal,u_lightDir);//
float ndo = pos.y;//dot(u_planeNormal,vec3(pos.x,pos.y,pos.z));//
if (ndd == 0)
{
t = 0;
}
else
{
t = (u_planeHeight-ndo) / ndd ;
}
ePosition = vec4(pos.x+u_lightDir.x*t,pos.y+u_lightDir.y*t,pos.z+u_lightDir.z*t,pos.w);
/// end Projection Coordinates Transformation
gl_Position = CC_PMatrix * ePosition;
}
片源着色器部分代码:
void main(void)
{
gl_FragColor = vec4(0.105,0.086,0.071,1);//u_color;
}
效果图:
