我正在尝试使用OpenTK在C#中创建基本的绘图查看器。要显示标题,x和y轴标签,我将从文本字符串创建每个标记的位图,并尝试将其用作指定位置的纹理。
字符串到位图的作用就像我将它们保存到磁盘一样,它们按照我的需要显示。然而,在将它们加载到纹理中并在屏幕上显示它们之间的某些地方出了问题。所有显示的都是黑色矩形。它们看起来大小合适我输入的文字大小,并且它们位于正确的位置,但我无法让它们显示正确的纹理。
将位图加载到纹理的代码如下:
public static int LoadTexture(Bitmap bitmap)
{
if (bitmap == null)
throw new ArgumentException("Bitmap is null.");
int id = GL.GenTexture();
GL.BindTexture(TextureTarget.Texture2D, id);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
BitmapData bmpdata = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, bmpdata.Width, bmpdata.Height, 0,
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, bmpdata.Scan0);
bitmap.UnlockBits(bmpdata);
return id;
}
我尝试显示代码的其中一段代码在这里:
GL.Enable(EnableCap.Texture2D);
GL.TexEnv(TextureEnvTarget.TextureEnv, TextureEnvParameter.TextureEnvMode, (float)TextureEnvMode.Modulate);
#region Title
{
Bitmap title = Graphics.Utilities.DrawText(_plot2D.Title, _font, _colorScheme.AxesLabels, _colorScheme.BackGround);
title.Save(@"S:\Projects\Visual Studio\SCG\Code\Graphics\Ogle\TestFiles\titleTest.png", ImageFormat.Png);
int titleID = SCG.Code.Graphics.Utilities.LoadTexture(title);
labelTextures.Add(titleID);
GL.BindTexture(TextureTarget.Texture2D, titleID);
double pl = w * _dim.PlotLeft;
double pr = w * _dim.PlotRight;
double pb = h * _dim.PlotBottom;
double pt = h * _dim.PlotTop;
double l = pl + (pr - pl - title.Width) / 2;
double r = pl + (pr - pl + title.Width) / 2;
double b = pt + (h - pt - title.Height) / 2;
double t = pt + (h - pt + title.Height) / 2;
GL.Begin(PrimitiveType.Quads);
GL.TexCoord2(0, 1); GL.Vertex2(l, b);
GL.TexCoord2(1, 1); GL.Vertex2(r, b);
GL.TexCoord2(1, 0); GL.Vertex2(r, t);
GL.TexCoord2(0, 0); GL.Vertex2(l, t);
GL.End();
}
#endregion // title
我已经查找了其他答案,有些人说它与GL.Enable(TextureCap.Texture2D)有关,但我尝试将其移动到不同的位置,甚至在每次尝试显示纹理之前复制命令但是什么都没有改变结果。
非常感谢任何帮助。
请注意,我几乎没有OpenTK或OpenGL的经验。
答案 0 :(得分:0)
问题在于当前加载的颜色是黑色的。要应用纹理,必须将颜色设置为GL.Color3(Color.Transparent)。然后代码工作正常。