我正在使用以下代码加载纹理:
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中的Create方法。创建纹理的SceneGraph用于将纹理的高度和宽度降至下一个最低的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
}