运行单game随附的任何"示例"项目都会导致" Monogameglexception"。这发生在以下代码中的纹理2D构造函数中。
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上。
tl; dr
这是由于OpenGL实现(MESA)不包含对内部纹理格式(S3TC)的支持而引起的错误。安装libtxc_dxtn库将此功能添加到台面。
问题
OpenGL是单体用于渲染图形的图形API。由于OpenGL只是API,因此您需要对该API进行一些实现才能使其在系统上工作。如果您有NVIDIA或ATI卡,则可以下载其专有驱动程序(其中包括OpenGL API的封闭源实现)。如果您不使用其专有驱动程序(或使用具有开源驱动程序的Intel Graphics卡之类的卡),那么您可能正在运行MESA,这是OpenGL API标准的开源实现。
。OpenGL具有基本标准,但也有许多扩展。这些扩展之一是ext_texture_compression_s3tc。这是一个扩展名,允许用户指定我们将我们正在加载到图形卡中的纹理应使用S3TC算法家族的特定算法压缩到图形卡中。这就是" gl.compressedteximage2d"行实际上是这样做的:它要求我们为使用dxt3算法压缩的质地腾出空间。
MESA并未实现所有OpenGL API和扩展名列表。具体来说,他们没有实施S3TC扩展(由于法律原因)。
"无效枚举"是MESA投掷的错误,因为您试图告诉MESA使用MESA不支持的扩展名(由枚举值PixelInternalFormat.CompressedRgbaS3tcDxt3Ext
指定)。这是OpenGL实施的标准方式告诉您您指的是一个不支持的值。
解决方案
所以,有两个选择可以解决此问题:
首先,解决方法使其停止使用S3TC。这可能需要更改单体代码,或者可能有一种更好的方法使用ContentPipeline来指定要使用的纹理压缩算法。
第二,安装S3TC算法。虽然MESA默认不包括S3TC,但您可以在MESA中包含外部库。Mesa Wiki S3TC页面上的更多详细信息。需要使用特定的编译器标志构建台面,然后需要安装库。在我的Ubuntu安装(12.04)中,我假设MESA软件包在编译时确实启用了此标志,因为安装库效果很好。在Ubuntu中,我安装了libtxc-dxtn-s2tc0
软件包。
sudo apt-get install libtxc-dxtn-s2tc0
之后,所有单体样本都在工作。