渲染世界的OPENGL<13>纹理进阶-矩形及立方体贴图

1.矩形纹理对于二维纹理图像来说,另一个有用的选项是纹理目标:GL_TEXTURE_RECTANGLE. 纹理特点:不能进行MIP贴图,意味着我们只能够加载glTexImage2D的第0层。 纹理坐标不是标准化的。这就意味着纹理坐标实际上是对像素寻址,而不是从0到1的范围覆盖图像的。 注意纹理坐标不能重复,并且不能支持压缩。 例如:纹理坐标(5,19)实际上是图像中从左起6个像素以及从上面起
摘要由CSDN通过智能技术生成

1.矩形纹理

对于二维纹理图像来说,另一个有用的选项是纹理目标:GL_TEXTURE_RECTANGLE.
纹理特点:不能进行MIP贴图,意味着我们只能够加载glTexImage2D的第0层。 纹理坐标不是标准化的。这就意味着纹理坐标实际上是对像素寻址,而不是从0到1的范围覆盖图像的。
注意纹理坐标不能重复,并且不能支持压缩。
例如:纹理坐标(5,19)实际上是图像中从左起6个像素以及从上面起第20个像素。

加载矩形纹理
gltWriteTGA函数将屏幕图像保存为一个Targa文件。
我们必须使用GL_NEAREST或者GL_LINEAR过滤器模式。

//前后的对比,一个是加载2D纹理,一个是加载矩形纹理

bool LoadTGATexture(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode)
{
    GLbyte *pBits;
    int nWidth, nHeight, nComponents;
    GLenum eFormat;

    // 读入纹理位
    pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
    if (pBits == NULL)
        return false;

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


    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, nWidth, nHeight, 0,
        eFormat, GL_UNSIGNED_BYTE, pBits);

    free(pBits);
    //用于检查MIP贴图纹理过滤器
    if (minFilter == GL_LINEAR_MIPMAP_LINEAR ||
        minFilter == GL_LINEAR_MIPMAP_NEAREST ||
        minFilter == GL_NEAREST_MIPMAP_LINEAR ||
        minFilter == GL_NEAREST_MIPMAP_NEAREST)
        glGenerateMipmap(GL_TEXTURE_2D);

    return true;
}


bool LoadTGATextureRect(const char *szFileName, GLenum minFilter, GLenum magFilter, GLenum wrapMode)
{
    GLbyte *pBits;
    int nWidth, nHeight, nComponents;
    GLenum eFormat;

    // 读入纹理位
    pBits = gltReadTGABits(szFileName, &nWidth, &nHeight, &nComponents, &eFormat);
    if (pBits == NULL)
        return false;
    //对纹理属性进行设置
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_S, wrapMode);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_WRAP_T, wrapMode);

    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MIN_FILTER, minFilter);
    glTexParameteri(GL_TEXTURE_RECTANGLE, GL_TEXTURE_MAG_FILTER, magFilter);

    //设置像素的存储格式
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    //加载2D图像到矩形纹理 
    glTexImage2D(GL_TEXTURE_RECTANGLE, 0, nComponents, nWidth, nHeight, 0,
        eFormat, GL_UNSIGNED_BYTE, pBits);

    free(pBits)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值