-1

运行 MonoGame 附带的任何“示例”项目将导致“MonoGameGLException”。这发生在以下代码的 Texture2D 构造函数中。

GL.CompressedTexImage2D(TextureTarget.Texture2D, 0, glInternalFormat,
    this.width, this.height, 0,
    imageSize, IntPtr.Zero);
GraphicsExtensions.CheckGLError(); <-- Error here

“glInternalFormat”的值为:

OpenTK.Graphics.OpenGL.PixelInternalFormat.CompressedRgbaS3tcDxt3Ext

这发生在英特尔集成显卡上运行的 Ubuntu Linux 上。

4

1 回答 1

3

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.CompressedRgbaS3tcDxt3ExtMesa 不支持的扩展名(由枚举值指定)。这是 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 示例都可以正常工作。

于 2012-10-20T15:12:08.197 回答