OpenGL大小球纹理镜像

2020-07-21  本文已影响0人  奉灬孝

这个案例是基于OpenGL综合练习基础上增加纹理和镜像效果的实现。

OpenGL纹理案例.png

一、SetupRC函数

    //6.设置地板顶点数据&地板纹理
    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();

纹理的顶点数据设置完成之后,我们就需要进行以下步骤:

1.分配纹理对象

由于使用了3种纹理,传入的纹理个数为3,并传入纹理数组

glGenTextures(3, uiTextures);
2.绑定纹理
glBindTexture(GL_TEXTURE_2D, uiTextures[0]);
3.加载纹理
LoadTGATexture("marble.tga", GL_LINEAR_MIPMAP_LINEAR, 
GL_LINEAR, GL_REPEAT);

二、加载纹理loadTGATexture函数

参数说明

  • 参数1:纹理文件名称
  • 参数2:文件宽度地址
  • 参数3:文件高度地址
  • 参数4:文件组件地址
  • 参数5:文件格式地址
  • 返回值:pBits,指向图像数据的指针
pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, 
&nComponents, &eFormat);
//设置环绕方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
//设置过滤方式
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
minFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
magFilter);
glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, nWidth, 
nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);
free(pBits);

参数说明

  • GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
glGenerateMipmap(GL_TEXTURE_2D);

三、RenderScene函数

1. 镜面绘制
    //6.压栈(镜面)
    modelViewMatrix.PushMatrix();
    
    //7.---添加反光效果---
    //翻转Y轴
    modelViewMatrix.Scale(1.0f, -1.0f, 1.0f);
    //镜面世界围绕Y轴平移一定间距
    modelViewMatrix.Translate(0.0f, 0.8f, 0.0f);
    
    //8.指定顺时针为正面
    glFrontFace(GL_CW);
  
    //9.绘制地面以外其他部分(镜面)
    drawSomething(yRot);
   
    //10.恢复为逆时针为正面
    glFrontFace(GL_CCW);
    
    //11.绘制镜面,恢复矩阵
    modelViewMatrix.PopMatrix();
2.地板绘制
//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层的纹理单元),level
*/
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_MODULATE,
                                 transformPipeline.GetModelViewProjectionMatrix(),vFloorColor,0);
   
//开始绘制
 floorBatch.Draw();
//关闭混合
glDisable(GL_BLEND);
3.非镜面绘制drawSomething函数

四、drawSomething函数

1.定义光源位置&漫反射颜色
static GLfloat vWhite[] = { 1.0f, 1.0f, 1.0f, 1.0f };
static GLfloat vLightPos[] = { 0.0f, 3.0f, 0.0f, 1.0f };
2.绘制悬浮小球球
glBindTexture(GL_TEXTURE_2D, uiTextures[2]);
for(int i = 0; i < NUM_SPHERES; i++) {
    modelViewMatrix.PushMatrix();
    modelViewMatrix.MultMatrix(spheres[i]);
    shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
                                 modelViewMatrix.GetMatrix(),
                                 transformPipeline.GetProjectionMatrix(),
                                 vLightPos,
                                 vWhite,
                                 0);
    sphereBatch.Draw();
    modelViewMatrix.PopMatrix();
}
3.绘制大球
modelViewMatrix.Translate(0.0f, 0.2f, -2.5f);
modelViewMatrix.PushMatrix();
modelViewMatrix.Rotate(yRot, 0.0f, 1.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, uiTextures[1]);
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
                             modelViewMatrix.GetMatrix(),
                             transformPipeline.GetProjectionMatrix(),
                             vLightPos,
                             vWhite,
                             0);
torusBatch.Draw();
modelViewMatrix.PopMatrix();
4.绘制公转小球(公转自转)
modelViewMatrix.PushMatrix();
modelViewMatrix.Rotate(yRot * -2.0f, 0.0f, 1.0f, 0.0f);
modelViewMatrix.Translate(0.8f, 0.0f, 0.0f);
glBindTexture(GL_TEXTURE_2D, uiTextures[2]);
shaderManager.UseStockShader(GLT_SHADER_TEXTURE_POINT_LIGHT_DIFF,
                             modelViewMatrix.GetMatrix(),
                             transformPipeline.GetProjectionMatrix(),
                             vLightPos,
                             vWhite,
                             0);
sphereBatch.Draw();
modelViewMatrix.PopMatrix();

Demo:
OpenGL大小球纹理镜像

上一篇 下一篇

猜你喜欢

热点阅读