SharpGL 低分辨率纹理

SharpGL Low Resolution Textures

我正在使用以下代码加载纹理:

var texture = new SharpGL.SceneGraph.Assets.Texture();
texture.Create(gl, filename);

但是当我将它们渲染到多边形上时,它们的分辨率非常低。它看起来大约是 100x100,但源图像的分辨率比那个高得多。

添加我稍后调用的纹理:

gl.Enable(OpenGL.GL_TEXTURE_2D);
gl.BindTexture(OpenGL.GL_TEXTURE_2D, 0);

除了为每个顶点提供 gl.TexCoord 之外,这就是我调用的所有纹理命令 这一切都很好,但只是显示的图像非常像素化和模糊。

是否有一些我必须使用的 OpenGL 设置来启用更高分辨率的纹理?

所以答案是 SharpGL.SceneGraph 中用于创建纹理的 Create 方法用于将纹理采样下采样到高度和宽度的下一个最低的 2 次幂,并完成了一项真正糟糕的工作。例如,一张 428x612 的图像将被下采样到 256x512... 很差。

我写了这个扩展方法,它将位图导入纹理并保留完整分辨率。

public static bool CreateTexture(this OpenGL gl, Bitmap image, out uint id)
{
    if (image == null)
    {
        id = 0;
        return false;
    }

    var texture = new SharpGL.SceneGraph.Assets.Texture();
    texture.Create(gl);
    id = texture.TextureName;

    BitmapData bitmapData = image.LockBits(new Rectangle(0, 0, image.Width, image.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
    var width = image.Width;
    var height = image.Height;
    gl.BindTexture(OpenGL.GL_TEXTURE_2D, texture.TextureName);
    gl.TexImage2D(OpenGL.GL_TEXTURE_2D, 0, OpenGL.GL_RGB, width, height, 0, 32993u, 5121u, bitmapData.Scan0);
    image.UnlockBits(bitmapData);
    image.Dispose();

    gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_S, new[] { OpenGL.GL_CLAMP_TO_EDGE });
    gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_WRAP_T, new[] { OpenGL.GL_CLAMP_TO_EDGE });
    gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MIN_FILTER, new[] { OpenGL.GL_LINEAR });
    gl.TexParameterI(OpenGL.GL_TEXTURE_2D, OpenGL.GL_TEXTURE_MAG_FILTER, new[] { OpenGL.GL_LINEAR });
    return true;
}

我想如果我提供的图像文件已经缩放为 2 的幂但并不明显,我就不会遇到这个问题。

用法

if (gl.CreateTexture(bitmap, out var id))
{
    // Do something on success
}