OpenGL纹理综合练习

2020-07-22  本文已影响0人  CrazySnow

球体

球体运动效果图.gif

金字塔

纹理金字塔.gif

隧道

纹理隧道效果图.gif

针对以上三种立体图形添加纹理后的效果图,其绘制流程均是一下流程:


绘制流程(转载自Style_月月).png

主要针对纹理添加过程作出分析,完整代码见文章末尾

切换地板绘制方式,由原来的线条换成整个纹理图片替换,由于纹理贴图较小,这里使用了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);

完整demo

上一篇 下一篇

猜你喜欢

热点阅读