OpenGL纹理加载步骤以及相关API
在准备工作SetupRC
函数中
//分配纹理ID textureID
glGenTextures(1, &textureID);
//将生成的纹理ID绑定到对应的目标纹理上
//目标纹理只能是 GL_TEXTURE_1D或者GL_TEXTURE_2D
glBindTexture(GL_TEXTURE_2D, textureID);
在渲染函数中不同的纹理需要一一对应再次绑定。
载入纹理:
//将TGA加载为纹理
/**
fileName:纹理文件路径
minFilter:
magFilter:
warpMode:
*/
bool LoadTGATexture(const char *fileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode) {
//指向图像数据的指针
GLbyte *pBits;
//纹理宽、高、组件
int nWidth, nHeight, nComponent;
//纹理格式 tga文件打印出来10进制为6407 对应的16进制为0x1907
//在glew.h中对应的宏为 #define GL_RGB 0x1907
GLenum eFormat;
pBits = gltReadTGABits(fileName, &nWidth, &nHeight, &nComponent, &eFormat);
if (pBits == NULL) {
return false;
}
//设置纹理参数
//wrapMode环绕模式 这里设置为 GL_CLAMP_TO_EDGE
//x y z 对应 GL_TEXTURE_WRAP_S GL_TEXTURE_WRAP_T GL_TEXTURE_WRAP_R
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapMode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapMode);
//设置过滤方式
//GL_TEXTURE_MIN_FILTER 和 GL_TEXTURE_MAG_FILTER 为缩小/放大过滤方式
//过滤方式常用:GL_NEAREST GL_LINEAR 临近过滤 和 线性过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter);
//载入纹理
//参数1:纹理维度
//参数2:level mip贴图层次
//参数3:纹理内部格式 接受:GL_ALPHA,GL_LUMINANCE,GL_LUMINANCE_ALPHA,GL_RGB,GL_RGBA
//参数4:宽度
//参数5:高度
//参数6:指定边框宽度 必须为0
//参数7:格式 接受 GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE,和GL_LUMINANCE_ALPHA
//参数8:纹理数据类型 接受 GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,和GL_UNSIGNED_SHORT_5_5_5_1
//参数9:指向纹理数据的指针
glTexImage2D(GL_TEXTURE_2D, 0, nComponent, nWidth, nHeight, 0, eFormat, GL_UNSIGNED_BYTE, pBits);
//释放指针
free(pBits);
//只有minFilter 等于以下四种模式,才可以生成Mip贴图
//GL_NEAREST_MIPMAP_NEAREST具有非常好的性能,并且闪烁现象非常弱
//GL_LINEAR_MIPMAP_NEAREST常常用于对游戏进行加速,它使用了高质量的线性过滤器
//GL_LINEAR_MIPMAP_LINEAR 和GL_NEAREST_MIPMAP_LINEAR 过滤器在Mip层之间执行了一些额外的插值,以消除他们之间的过滤痕迹。
//GL_LINEAR_MIPMAP_LINEAR 三线性Mip贴图。纹理过滤的黄金准则,具有最高的精度。
if(minFilter == GL_LINEAR_MIPMAP_LINEAR ||
minFilter == GL_LINEAR_MIPMAP_NEAREST ||
minFilter == GL_NEAREST_MIPMAP_LINEAR ||
minFilter == GL_NEAREST_MIPMAP_NEAREST)
//4.纹理生成所有的Mip层
//参数:GL_TEXTURE_1D、GL_TEXTURE_2D、GL_TEXTURE_3D
glGenerateMipmap(GL_TEXTURE_2D);
return true;
}
记得在程序退出或者不再使用时,移除纹理ID
glDeleteTextures(1, &textureID);
镜像
效果
方案:
主要是通过模型视图矩阵调用缩放函数,如下是把y坐标镜像,则y为-1,其他为1
modelViewMatrix.Scale(1.0f, -1.0f, 1.0f);
为了使两个镜像的物体有间隔,沿y轴平移一定距离
modelViewMatrix.Translate(0.0f, 0.8f, 0.0f);
然后画地板,为了更加生动形象,给地板设置一定透明度并开启混合。
demo 使用OpenGL macOS环境搭建(本地Pod引入) pod方式导入库
网友评论