球体
金字塔
隧道
针对以上三种立体图形添加纹理后的效果图,其绘制流程均是一下流程:
主要针对纹理添加过程作出分析,完整代码见文章末尾
切换地板绘制方式,由原来的线条换成整个纹理图片替换,由于纹理贴图较小,这里使用了10倍的纹理坐标大小,以获得更细腻的地板效果。
//5.设置地板顶点数据&地板纹理
GLfloat texSize = 10.0f;
floorBatch.Begin(GL_TRIANGLE_FAN, 4, 1);
floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);
floorBatch.Vertex3f(-20.f, -0.41f, 20.0f);
floorBatch.MultiTexCoord2f(0, texSize, 0.0f);
floorBatch.Vertex3f(20.0f, -0.41f, 20.f);
floorBatch.MultiTexCoord2f(0, texSize, texSize);
floorBatch.Vertex3f(20.0f, -0.41f, -20.0f);
floorBatch.MultiTexCoord2f(0, 0.0f, texSize);
floorBatch.Vertex3f(-20.0f, -0.41f, -20.0f);
floorBatch.End();
镜面效果的设置
镜面效果通过镜像绘制小球,并和地板进行混合达到镜面效果。
镜面之后,y轴的前后移动会反向;原来正面为逆时针,现在为顺时针。
//7.---添加反光效果---
//翻转Y轴
modelViewMatrix.Scale(1.0f, -1.0f, 1.0f);
//镜面世界围绕Y轴平移一定间距,因为镜面了,所以是向下移动0.8
modelViewMatrix.Translate(0.0f, 0.8f, 0.0f);
// 镜面后,原来逆时针为正面,现在顺时针为正面
//8.指定顺时针为正面
glFrontFace(GL_CW);
//9.绘制地面以外其他部分(镜面)
drawSomething(yRot);
//10.恢复为逆时针为正面
glFrontFace(GL_CCW);
//11.绘制镜面完毕,恢复矩阵
modelViewMatrix.PopMatrix();
//12.开启混合功能(绘制地板)
glEnable(GL_BLEND);
//13. 指定 glBlendFunc 颜色混合方程式
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
//14.绑定地面纹理
glBindTexture(GL_TEXTURE_2D, uiTextures[0]);
/*15.
纹理调整着色器(将一个基本色乘以一个取自纹理的单元nTextureUnit的纹理)
参数1:GLT_SHADER_TEXTURE_MODULATE
参数2:模型视图投影矩阵
参数3:颜色
参数4:纹理单元(第0层的纹理单元)
*/
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,
transformPipeline.GetModelViewProjectionMatrix(),
vFloorColor,
0);
//开始绘制
floorBatch.Draw();
//绘制完毕,取消混合
glDisable(GL_BLEND);