在对纹理使用的时候 首先我们要对理解上图 坐标的说明。三角形的三个顶点分别对应了坐标(0,0)(1,0)(0.5,1), 这个图就说明 在我们添加纹理的时候 一定要把图片的顶点映射到坐标系里面。当然 这个映射关系不是固定的。但是也要注意把图片铺开。
纹理使用的流程:我们再ChangeSize(),方法中的代码 还是和之前的一样。我们再这个方法里面设定视口大小。生成透视投影。在SetupRC()中会和之前绘制有所不同。
1.需要设置背景 和初始化ShaderManager。
2.生成纹理坐标 glFenTextures(TEXTURE_COUNT, textures);参数1 纹理对象的数量。参数2 纹理对象标识数组,
3. 绑定纹理对象(每绘制一个面 都要进行纹理绑定) glBindTexture(GL_TEXTURE_2D,texttures[i]), 参数1纹理模式 GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D,参数2需要绑定的纹理对象,
4.加载tga文件 pBytes=gltReadTGABits(szTextureFiles[i],&iWidth,&iHeight,&iComponents,&eFromat);参数1.纹理文件名称(tag文件的名字),参数2.文件宽度变量地址,参数3.文件高度变量地址,参数4.文件组件变量地址,参数5文件格式变量地址,返回值pBytes,指向图像数据的指针.
5.加载纹理,设置过滤器和包装模式 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST);GL_TEXTURE_MAG_FILTER(放大过滤器 GL_TEXTURE_MIN_FILTER(缩小过滤器),GL_NEAREST(最邻近过滤),设置环绕模式 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);GL_TEXTURE_WRAP_S(s轴环绕)GL_TEXTURE_WRAP_T(T轴环绕),GL_CLAMP_TO_EDGE(环绕模式强制对范围之外的纹理坐标沿着合法的纹理单元的最后一行或一列进行采样),我们需要把放大过滤器 和缩小过滤器都设置。同样也要把S轴环绕和T轴环绕设置。
6.载入纹理,glTextImage2D(GL_TEXTURE_2D,0,iComponents,iWidth,iHeight,0,eFormat,GL_UNSIGNED_BYTE,pBytes). 参数1.纹理纬度,参数2.mip贴图的层次,参数3.纹理单元存储的颜色成分(从读取像素图中获得),参数4.加载纹理宽度,参数5.加载纹理高度,参数6.加载纹理的深度,参数7.像素数据的数据类型,GL_UNSIGNED_BYTES无符号整型,参数8.指向纹理图像数据的指针。
7.为纹理对象生成一组完整的mip贴图 glGenerateMipmap(GL_TEXTURE_2D);
8.释放原始纹理数据。不在需要纹理原始数据了 free(pBytes);
9.设置几何图像顶点/纹理坐标 GLTools库中的容器,GBatch void GLBatch::Begin(GLenum primitive,GLuint nVerts,GLuint nTextureUnits = 0); 参数1.图元枚举值,参数2.顶点数,参数3.纹理坐标的组数、floorBatch.Begin(GL_TRIANGLE_STRIP,28,1); //顶点坐标和纹理的映射floorBatch.MultiTexCoord2f(0, 0.0f, 0.0f);参数1.是表示图层。参数2.x轴。参数3.Y轴 floorBatch.Vertex3f(-10.0f, -10.0f, z);参数1.X轴。参数2.Y轴,参数3.Z轴 floorBatch.End();结束
以上步骤是我们需要在SetupRC()中的流程。接下来我们需要在RenderScene()方法里面进行绘制
1.首先 我们要清空缓冲区,模型视图压栈,轴平移
2.纹理替换矩阵着色器,shaderManager.UseStockShader(GLT_SHADER_TEXTURE_REPLACE, transformPipeline.GetModelViewProjectionMatrix(), 0);参数1.着色器标签 在这里我们使用的是纹理替换矩阵着色器,参数2.模型视图投影矩阵,参数3.纹理层
3.绑定纹理 glBindTexture(GL_TEXTURE_2D,texttures[1]);参数1.纹理模式,参数2.需要绑定的纹理 。 绘制 floorBatch.Draw();
4.交换缓冲区,glutSwapBuffers();,当由于我们之前进行了压栈 所以要注意 先出栈 在进行交换缓冲区。
至此我们就可以绘制把图片绘制到我们想要添加的 位置上。