Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于显示标签文本的OpenTK纹理显示为黑色_C#_Opengl_Textures_Opentk - Fatal编程技术网

C# 用于显示标签文本的OpenTK纹理显示为黑色

C# 用于显示标签文本的OpenTK纹理显示为黑色,c#,opengl,textures,opentk,C#,Opengl,Textures,Opentk,我正在尝试使用OpenTK在C#中制作一个基本的绘图查看器。为了显示标题、x轴和y轴标签,我从文本字符串中创建了每个标签的位图,并尝试将其用作指定位置的纹理 “字符串到位图”的工作原理是,我已将它们保存到磁盘,并且它们按我所需的方式显示。然而,在将它们加载到纹理和在屏幕上显示它们之间的某个地方出现了问题。所有显示的都是黑色矩形。它们看起来与我输入的文本大小差不多,并且它们位于正确的位置,但我无法让它们显示正确的纹理 将位图加载到纹理的代码如下: public static int LoadTe

我正在尝试使用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方面的经验。

问题在于当前加载的颜色是黑色。要应用纹理,颜色必须设置为GL.Color3(color.Transparent)。然后代码工作正常。

问题在于当前加载的颜色是黑色。要应用纹理,颜色必须设置为GL.Color3(color.Transparent)。然后代码运行良好。

如果尝试使用透明纹理,请确保正确设置了GL混合状态。我只是尝试在OnPaint方法的开头添加GL.Enable(EnableCap.blend),在结尾添加disable,但似乎没有什么不同。我还尝试将所有像素格式更改为RGB,但这也没什么不同。仅仅启用它是不够的。你需要设置适当的混合函数/方程。我打算这些标签是不透明的。所有使用的颜色都是标准颜色。黑色、彩色、白色等,因此它们没有任何透明度。你认为它不工作是因为PixelType被设置为一种可能是透明的颜色吗?这就是为什么我说我试着将所有的像素格式选项改为RGB而不是RGBA,但仍然不起作用。混合/透明只是对结果的众多可能解释之一。使用RGB格式时,您可能会排除这一问题。如果您尝试使用透明纹理,请确保您正确设置了GL混合状态。我只是尝试在OnPaint方法的开始处添加GL.Enable(EnableCap.blend),在结束处添加disable,这似乎没有什么不同。我还尝试将所有像素格式更改为RGB,但这也没什么不同。仅仅启用它是不够的。你需要设置适当的混合函数/方程。我打算这些标签是不透明的。所有使用的颜色都是标准颜色。黑色、彩色、白色等,因此它们没有任何透明度。你认为它不工作是因为PixelType被设置为一种可能是透明的颜色吗?这就是为什么我说我试着将所有的像素格式选项改为RGB而不是RGBA,但仍然不起作用。混合/透明只是对结果的众多可能解释之一。在使用RGB格式时,您可能会排除这一问题。