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());
}