【问题标题】:open GL texture compressionopenGL 纹理压缩
【发布时间】:2011-01-04 07:15:19
【问题描述】:

我是 Open GL 的新手。

是否需要在运行时进行纹理压缩?

当然,它的工作方式是在构建时压缩一个大的纹理文件。在运行时,您可以根据需要扩展压缩纹理文件的一部分以应用于表面。

在任何(可信的)情况下,您已经扩展了纹理数据,并且需要在运行时对其进行压缩?

谢谢!

【问题讨论】:

    标签: opengl compression textures


    【解决方案1】:

    您是在谈论压缩图像格式(如 JPEG 甚至包含图像的 zip 文件)还是压缩纹理格式(如 DXT1 等)?当您拥有压缩纹理(例如 DXT)时,您不必在运行时对其进行解压缩,显卡可以在对纹理进行采样时即时进行解压缩。

    对于可以提前预编译所有资产的游戏,通常最好在(资产)构建时应用 DXT 压缩之类的东西,这样您就可以获得纹理压缩的所有好处(更快的加载时间、更少的内存带宽使用等),而无需在运行时实际执行压缩。也就是说,在您想使用压缩纹理进行渲染但无法访问您将提前使用的图像(也许您让用户从他们的机器或其他东西中选择图像文件)的任何情况下,您将拥有别无选择,只能在运行时进行压缩。

    编辑:

    在运行时进行 DXT 压缩的方法是调用 glTexImage2D,为“格式”参数指定源图像的实际格式(GL_RGBA 等),为“内部格式”参数指定压缩格式,例如 DXT1 的 GL_COMPRESSED_RGBA_S3TC_DXT1_EXT,假设您的卡支持 gl_ext_texture_compression_s3tc 扩展。

    如果你有预压缩的纹理数据,那么你可以直接使用 glCompressedTexImage2D 加载它。

    【讨论】:

    • 我说的是压缩纹理格式,而不是像 jpg 和 png 这样的压缩图片格式。感谢您提供有用的答案 - 您需要在运行时进行压缩的最常见(唯一?)地方是在运行时选择纹理时。您不需要显式解压缩,因为图形驱动程序支持这一点。
    • 这实际上只是一个常识性问题,您宁愿在哪里执行相对昂贵的压缩纹理操作...提前、离线或在运行时可能会或可能不会导致明显暂停。如果您出于某种原因无法提前访问纹理,那么显然您无法离线压缩它。
    • 我要补充的最后一条评论是,将预压缩纹理放入您的应用程序的最简单方法可能是使用可以包含压缩 DXT 图像数据的 DDS 文件。许多图像编辑应用程序(如 Paint.NET)可以为您导出 DDS 文件。在运行时,您只需加载文件并将压缩数据直接传递给 glCompressedTexImage2D。
    猜你喜欢
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多