TL;博士
这是由于 OpenGL 实现 (Mesa)不包含对内部纹理格式 ( S3TC ) 的支持而导致的错误。安装 libtxc_dxtn 库以将此功能添加到 Mesa。
问题
OpenGL 是 MonoGame 用来渲染图形的图形 API。由于 OpenGL 只是一个 API,因此您需要对该 API 进行一些实现才能使其在您的系统上运行。如果您有 NVIDIA 或 ATI 卡,您可以下载它们的专有驱动程序(包括 OpenGL API 的闭源实现)。如果您不使用他们的专有驱动程序(或使用具有开源驱动程序的英特尔显卡之类的卡),那么您可能正在运行Mesa,它是 OpenGL API 标准的开源实现。
OpenGL 有一个基本标准,但它也有许多扩展。这些扩展之一是EXT_texture_compression_s3tc。这是一个扩展,允许用户指定我们加载到显卡中的纹理应该使用S3TC系列算法的特定算法进行压缩。这就是“GL.CompressedTexImage2D”行的实际作用:它要求我们为将使用 DXT3 算法压缩的纹理腾出空间。
Mesa 没有实现所有的 OpenGL API 和扩展列表。具体来说,他们没有实现S3TC扩展(由于法律原因)。
“无效枚举”是 Mesa 抛出的错误,因为您试图告诉 Mesa 使用PixelInternalFormat.CompressedRgbaS3tcDxt3Ext
Mesa 不支持的扩展名(由枚举值指定)。这是 OpenGL 实现告诉您您指的是不受支持的值的标准方式。
解决方案
因此,有两种方法可以解决此问题:
首先,解决 MonoGame 以便它停止使用 S3TC。这可能需要更改 MonoGame 代码,或者可能有更好的方法使用 ContentPipeline 来指定要使用的纹理压缩算法。
二、安装S3TC算法。虽然 Mesa 默认不包含 S3TC,但您可以包含 Mesa 的外部库。有关Mesa Wiki S3TC 页面的更多详细信息。Mesa 需要使用特定的编译器标志构建,然后需要安装库。在我的 Ubuntu 安装(12.04)中,我假设 Mesa 包在编译时确实启用了这个标志,因为安装库运行良好。在 Ubuntu 中,我安装了该libtxc-dxtn-s2tc0
软件包。
sudo apt-get install libtxc-dxtn-s2tc0
之后,所有 MonoGame 示例都可以正常工作。