opengles动画

来源:互联网 发布:linux shell 引号 参数 编辑:程序博客网 时间:2024/06/05 12:15

本例让模型顶点在任意轴方向做余弦变化,从而产生波浪线效果



shader实现

const char* vs = {"attribute vec3 inVertex;""attribute vec3 inNormal;""uniform mat4 MVPMatrix;""uniform vec3 LightDirection;""uniform vec3 EyePosition;""uniform float myAnim;""varying vec2 TexCoord;""void main()""{"//余弦函数   radians(degree)将角度转换成弧度"float ripple=5.0*cos(0.2*inVertex.y+(radians(5.0*myAnim*360.0)));"//让模型在Z轴方向顶点做余弦变化,也可以在X,Y,Z任意方向做正弦,余弦变化,产生跳动效果."gl_Position=MVPMatrix*vec4(inVertex.x,inVertex.y,inVertex.z+ripple,1.0);"//normalize(x) 归一化"vec3 eyeDirection=normalize(EyePosition-inVertex);""TexCoord.x=dot(LightDirection,inNormal);""TexCoord.y=dot(eyeDirection,inNormal);""}"};const char* ps ={"precision lowp float;""uniform sampler2D sTexture;""varying vec2 TexCoord;""const vec3 cBaseColor=vec3(0.2,1.0,0.7);""void main()""{""gl_FragColor=vec4(cBaseColor*texture2D(sTexture,TexCoord).rgb,1.0);""}"};
渲染函数

    virtual void    onRender(Program_SINE& shader,CELL3RDCamera& camera)        {static float angle = 0;matrix4 matRot(1);matRot.rotateY(angle);matrix4 matTrans;matTrans.translate(0,5,0);matrix4 matScale(1);matScale.scale(0.3f,0.3f,0.3f);//模型总的变化矩阵matrix4 matModel = matTrans*matScale;angle += 0.01f;float4 vMsEyePos = float4(0,0,125,1)*matModel;//眼睛观察点坐标_device.setUniform3fv(shader.EyePosition,1,&vMsEyePos.x);//光源射入方向float4 vMsLightDir = float4(1, 2, 1, 0)*matModel;float3 vMsLightDirS = normalize(float3(vMsLightDir.x,vMsLightDir.y,vMsLightDir.z));_device.setUniform3fv(shader.LightDirection,1,&vMsLightDirS.x);_device.setUniform1f(shader.myAnim,angle);//模型旋转角度//光源位置float4 vMsLightPos = float4(50,20,40,1);vMsLightPos = vMsLightPos*matModel;matrix4 MVP = camera._matProj*camera._matView*matModel;_device.setUniformMatrix4fv(shader.MVPMatrix,1,false,MVP.data());VertexBumpMap* vert = &_arVertexs.front();_device.attributePointer(shader.inVertex,3,GL_FLOAT,GL_FALSE,sizeof(VertexBumpMap),vert);_device.attributePointer(shader.inNormal, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._normal);_device.drawElements(GL_TRIANGLES,_arFaces.size()*3,GL_UNSIGNED_SHORT,&_arFaces.front());        }



原创粉丝点击