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
}
我正在使用以下代码加载纹理:
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
}