gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:41:47 25 4
gpt4 key购买 nike

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

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

最佳答案

TL;DR

这是由于 OpenGL 实现 (Mesa) does not contain support 引起的错误对于内部纹理格式( 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扩展名(由于 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 示例都可以正常工作。

关于linux - 创建纹理时 MonoGame 抛出 MonoGameGLException (InvalidEnum) 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12989769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com