MonoGame在创建纹理时抛出MonoGameGLException(InvalidEnum)错误

时间:2012-10-20 15:11:00

标签: linux opengl monogame mesa

运行MonoGame附带的任何“Sample”项目将导致“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

这种情况发生在运行在Intel集成显卡上的Ubuntu Linux上。

1 个答案:

答案 0 :(得分:3)

TL; DR

这是由于内部纹理格式(does not contain support)的OpenGL实现(Mesa)S3TC而导致的错误。安装libtxc_dxtn库以将此功能添加到Mesa。

问题

OpenGL是MonoGame用于渲染图形的图形API。由于OpenGL只是一个API,因此您需要对该API进行一些实现才能使其在您的系统上运行。如果你有NVIDIA或ATI卡,你可以下载他们的专有驱动程序(包括OpenGL API的闭源实现)。如果您没有使用他们的专有驱动程序(或使用具有开源驱动程序的英特尔显卡等卡),那么您可能正在运行Mesa,这是OpenGL API标准的开源实现。< / p>

OpenGL有一个基本标准,但它也有很多扩展。其中一个扩展名为EXT_texture_compression_s3tc。这是一个扩展,允许用户指定我们加载到图形卡中的纹理应使用S3TC算法族的特定算法进行压缩。这就是“GL.CompressedTexImage2D”行实际上做的事情:它要求我们为将使用DXT3算法压缩的纹理腾出空间。

Mesa没有实现所有OpenGL API和扩展列表。具体来说,他们没有实施S3TC扩展(由于legal reasons)。

“无效枚举”是Mesa抛出的错误,因为您试图告诉Mesa使用Mesa不支持的扩展(由枚举值PixelInternalFormat.CompressedRgbaS3tcDxt3Ext指定)。这是OpenGL实现告诉您引用不受支持的值的标准方法。

解决方案

因此,有两种方法可以解决这个问题:

首先,解决方法MonoGame,以便它停止使用S3TC。这可能需要更改MonoGame代码,或者可能有更好的方法使用ContentPipeline指定要使用的纹理压缩算法。

其次,安装S3TC算法。虽然默认情况下Mesa不包含S3TC,但您可以为Mesa包含一个外部库。有关Mesa Wiki S3TC page的更多详情。 Mesa需要使用特定的编译器标志构建,然后需要安装库。在我的Ubuntu安装(12.04)中,我假设Mesa包在编译时确实启用了此标志,因为安装库运行良好。在Ubuntu中,我安装了libtxc-dxtn-s2tc0包。

sudo apt-get install libtxc-dxtn-s2tc0

之后,所有MonoGame样本都在运行。