opengl SharpGL低分辨率纹理

daolsyd0  于 2022-11-04  发布在  其他
关注(0)|答案(1)|浏览(154)

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

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设置才能启用更高分辨率的纹理?

x33g5p2x

x33g5p2x1#

因此,答案是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
}

相关问题