美文网首页
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纹理加载与镜像

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