shader实现
const char* vs = { "attribute vec3 inVertex;"//顶点 "attribute vec3 inNormal;"//法线 "attribute vec2 inTexCoord;"//纹理 "attribute vec3 inTangent;"//切线 "uniform mat4 MVPMatrix;" "uniform vec3 EyePosMV;" "varying vec3 EyeDirection;" "varying vec2 TexCoord;" "void main()" "{" "gl_Position=MVPMatrix*vec4(inVertex,1);" "vec3 eyeDirModel=normalize(EyePosMV-inVertex);"//观察方向 "vec3 binormal=cross(inNormal,inTangent);"//法线和切线向量求叉积 "mat3 tangentSpaceXform=mat3(inTangent, binormal, inNormal);"//构造BTN矩阵 "EyeDirection=eyeDirModel*tangentSpaceXform;" "TexCoord=inTexCoord;" "}" }; const char* ps = { "precision lowp float;"//指定float的类型为低精度 "uniform sampler2D sReflectTex;" "uniform sampler2D sNormalMap;" "varying vec3 EyeDirection;" "varying vec2 TexCoord;" "void main()" "{" "vec3 normal=texture2D(sNormalMap,TexCoord).rgb*2.0-1.0;" "vec3 reflectDir=reflect(normal,EyeDirection);"//reflect(I, N): I的反射方向, I -2*dot(N, I)*N, N必须先归一化 "vec2 reflectCoord=(reflectDir.xy)*0.5+0.5;" "gl_FragColor=texture2D(sReflectTex,reflectCoord);" "}" }; 渲染函数 virtual void onRender(Program_Perturbed& 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*matRot*matScale; angle += 1.0f; matrix4 MVP = camera._matProj*camera._matView*matModel; matrix4 mv = camera._matView*matModel; matrix4 mvI = mv.inverse(); float4 vEyePosModel; vEyePosModel = mvI*float4(0,0,0,1); _device.setUniformMatrix4fv(shader.MVPMatrix,1,false,MVP.data()); _device.setUniform3fv(shader.EyePosModel, 1, &vEyePosModel.x); 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.attributePointer(shader.inTexCoord, 2, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._uv); _device.attributePointer(shader.inTangent, 3, GL_FLOAT, GL_FALSE, sizeof(VertexBumpMap), &vert[0]._tangent); _device.drawElements(GL_TRIANGLES,_arFaces.size()*3,GL_UNSIGNED_SHORT,&_arFaces.front()); }