OpenGL载入DDS压缩纹理

4 篇文章 0 订阅
3 篇文章 0 订阅

网络上的图像库很多,如 FreeImage Devil 等,库很强大且支持多种格式,当然也包括 DDS 纹理。例如 FreeImage ,但是它这里所说的支持 DDS 格式是指将压缩格式的数据重新解压成 RGBA 像素数据,将数据解压后再绑定到 OpenGL 中就失去了其作为压缩纹理的高效性(因 OpenGL 直接支持此压缩纹理数据)。 FreeImage 作者建议参考 Ogre DDS 纹理载入实现,但那部分实现与 Ogre 切合太紧不便 Ogre 之外应用,需要的是一个方便的压缩纹理绑定函数。多方查找后发现 Nvidia 的一个小类库 nv_dds 挺好用的,就把它封装了一下,附上源码 (可根据实际需要扩充功能)。

/** DDS 纹理绑定函数

  * @param[in] filePath 纹理路径

  * @param[out] texID 纹理 ID

  * @return 数据信息

  * - 0 打开失败

  * - 1 RGB 格式

  * - 2 RGBA 格式

  */

unsigned BuildDDS (char *filePath , unsigned &texID )

{

    nv_dds ::CDDSImage image ;

    if (!image .load (string (filePath )))

    {

        return 0;

    }

 

    glGenTextures (1, &texID );

    glEnable (GL_TEXTURE_2D );

    glBindTexture (GL_TEXTURE_2D , texID );

 

    glCompressedTexImage2D (GL_TEXTURE_2D , 0, image .get_format (),

        image .get_width (), image .get_height (), 0, image .get_size (), image );

 

    for (int i = 0; i < image .get_num_mipmaps (); i ++)

    {

        glCompressedTexImage2D (GL_TEXTURE_2D , i +1, image .get_format (),

            image .get_mipmap (i ).get_width (), image .get_mipmap (i ).get_height (), 0,

            image .get_mipmap (i ).get_size (), image .get_mipmap (i ));

    }

    return image .get_components () < 4 ? 1 : 2;

}

源码中使用到了 glext.h 头文件、 glut glew 两个 OpenGL 相关库,需自行添加到 VC2010 的相关目录中,同时将 dds 纹理置于 C 盘或自行修改路径。



PixiJS 6.5的Texture Loader默认不支持DDS压缩纹理的加载,但可以通过使用pixi-compressed-textures插件来实现。这个插件可以让你加载BC1-5、ETC1、PVRTC等压缩纹理格式。 首先,你需要安装该插件。你可以通过npm安装它: ``` npm install pixi-compressed-textures ``` 安装完后,你需要在你的代码中导入它并将其添加到PixiJS的Loader中: ```javascript import { CompressedTextureLoader } from 'pixi-compressed-textures'; import { Loader } from 'pixi.js'; // 将 CompressedTextureLoader 添加到 PixiJS Loader Loader.registerPlugin(CompressedTextureLoader); ``` 现在你可以使用PixiJS的Loader加载DDS纹理了: ```javascript import { Loader } from 'pixi.js'; // 加载dds纹理 Loader.shared.add('myTexture', 'path/to/myTexture.dds'); Loader.shared.load(() => { const texture = Loader.shared.resources.myTexture.texture; // 使用纹理 }); ``` 你需要注意的是,由于不同的设备和浏览器支持的压缩纹理格式不同,因此需要使用不同的纹理格式来保证兼容性。你可以使用CompressedTextureLoader的getSupportedFormats()方法获取当前设备支持的所有格式。例如,如果你想使用PVRTC格式来加载纹理: ```javascript import { CompressedTextureLoader } from 'pixi-compressed-textures'; import { Loader } from 'pixi.js'; Loader.registerPlugin(CompressedTextureLoader); const supportedFormats = CompressedTextureLoader.getSupportedFormats(); if (supportedFormats.pvrtc) { // 加载PVRTC格式纹理 Loader.shared.add('myTexture', 'path/to/myTexture.pvr'); } else { // 加载普通的非压缩纹理 Loader.shared.add('myTexture', 'path/to/myTexture.png'); } Loader.shared.load(() => { const texture = Loader.shared.resources.myTexture.texture; // 使用纹理 }); ``` 希望对你有所帮助!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值