创建纹理时,单体组会抛出单胶质感应(无效)错误



运行单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

之后,所有单体样本都在工作。

相关内容

  • 没有找到相关文章