美文网首页
OpenGL纹理加载与镜像

OpenGL纹理加载与镜像

作者: ugpass | 来源:发表于2020-07-22 11:43 被阅读0次

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);

镜像
效果

qiu.gif

方案:
主要是通过模型视图矩阵调用缩放函数,如下是把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方式导入库

相关文章

  • OpenGL纹理加载与镜像

    OpenGL纹理加载步骤以及相关API 在准备工作SetupRC函数中 在渲染函数中不同的纹理需要一一对应再次绑定...

  • OPenGL ES纹理翻转解决方案

    纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL要求纹理坐标原...

  • OpenGL笔记十三:GLSL加载纹理颠倒六种方案

    前言 期待您移步上篇:OpenGL笔记十二:初探GLSL加载图片纹理 纹理颠倒原因 GLSL 加载一张图片纹理,最...

  • OpenGL 纹理翻转策略

    Open GL纹理翻转 在使用OpenGL函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL...

  • OpenGL ES之旅(三)-- OpenGL ES 纹理翻转解

    纹理翻转概述 在使用OpenGL ES函数加载纹理到图形时,经常遇到纹理上下颠倒的问题。原因是因为OpenGL E...

  • 十九 GLKit 及API

    GLKit 目标是为了简化基于OpenGL / OpenGL ES 的应⽤开发,使用数学库,背景纹理加载,预先创建...

  • OpenGL笔记十四:GLSL语法

    前言 期待您移步上篇:OpenGL笔记十三:GLSL加载纹理颠倒六种方案 概述 GLSL 全称 OpenGL Sh...

  • OpenGL坐标概念

    openGL 顶点,坐标系,纹理坐标Android OpenGL es 纹理坐标设定与贴图规则对Android o...

  • OpenGL-- 纹理加载

    前言 这一篇文章的主要内容是用OpenGL去加载纹理,也就是将图片加载到屏幕上。之前几篇文章已经讲解了OpenGL...

  • iOS:OpenGL加载纹理

    参看资料:https://juejin.im/post/5cfa680b6fb9a07ef63fced8 Open...

网友评论

      本文标题:OpenGL纹理加载与镜像

      本文链接:https://www.haomeiwen.com/subject/gacgkktx.html