opentk中绘制的四边形,线,点不显示正确

Posted

技术标签:

【中文标题】opentk中绘制的四边形,线,点不显示正确【英文标题】:Drawn quads, lines, points in opentk don't show up right 【发布时间】:2014-01-22 17:30:48 【问题描述】:

我现在已经在我的 2d 游戏引擎中绘制了与 OpenTK 一起使用的精灵。我遇到的唯一问题是带有 opengl 的自定义绘制对象(除了精灵之外的任何东西)显示为背景颜色。示例:

我在这里画一条 2.4f 宽的黑线。示例中还有一个四边形和一个点,但它们不会与实际可见的任何内容重叠。这条线与洋红色精灵重叠,但颜色是错误的。我的问题是:我是缺少 OpenGL 功能,还是做错了什么可怕的事情?

这些是我的绘图项目示例:(如果对代码有疑问,您也可以在https://github.com/Villermen/HatlessEngine找到该项目)

初始化:

        Window = new GameWindow(windowSize.Width, windowSize.Height);

        //OpenGL initialization
        GL.Enable(EnableCap.PointSmooth);
        GL.Hint(HintTarget.PointSmoothHint, HintMode.Nicest);
        GL.Enable(EnableCap.LineSmooth);
        GL.Hint(HintTarget.LineSmoothHint, HintMode.Nicest);

        GL.Enable(EnableCap.Blend);
        GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.OneMinusSrcAlpha);

        GL.ClearColor(Color.Gray);

        GL.Enable(EnableCap.Texture2D);

        GL.Enable(EnableCap.DepthTest);
        GL.DepthFunc(DepthFunction.Lequal);
        GL.ClearDepth(1d);
        GL.DepthRange(1d, 0d); //does not seem right, but it works (see it as duct-tape)

每个抽奖周期:

        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
        //reset depth and color to be consistent over multiple frames
        DrawX.Depth = 0;
        DrawX.DefaultColor = Color.Black;

        foreach(View view in Resources.Views)
        
            CurrentDrawArea = view.Area;
            GL.Viewport((int)view.Viewport.Left * Window.Width, (int)view.Viewport.Top * Window.Height, (int)view.Viewport.Right * Window.Width, (int)view.Viewport.Bottom * Window.Height);
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadIdentity();
            GL.Ortho(view.Area.Left, view.Area.Right, view.Area.Bottom, view.Area.Top, -1f, 1f);

            GL.MatrixMode(MatrixMode.Modelview);
            //drawing
            foreach (LogicalObject obj in Resources.Objects)
            
                //set view's coords for clipping?
                obj.Draw();
            
        

        GL.Flush();
        Window.Context.SwapBuffers();

DrawX.Line:

    public static void Line(PointF pos1, PointF pos2, Color color, float width = 1)
    
        RectangleF lineRectangle = new RectangleF(pos1.X, pos1.Y, pos2.X - pos1.X, pos2.Y - pos1.Y);

        if (lineRectangle.IntersectsWith(Game.CurrentDrawArea))
        
            GL.LineWidth(width);
            GL.Color3(color);

            GL.Begin(PrimitiveType.Lines);

            GL.Vertex3(pos1.X, pos1.Y, GLDepth);
            GL.Vertex3(pos2.X, pos2.Y, GLDepth);

            GL.End();
        
    

编辑:如果我之前禁用 blendcap 并在绘制线条后启用它,它会以正确的颜色显示,但我必须将它混合。

【问题讨论】:

愚蠢的问题:你检查过你尝试使用的颜色是你真正想要的颜色吗? 是的,我什至用 GL.Color4 调用替换了函数中的颜色变量 【参考方案1】:

我忘记在纹理绘制方法中取消绑定纹理...

GL.BindTexture(TextureTarget.Texture2D, 0);

【讨论】:

实际上,这只会使线条看起来正确。四边形和点仍然不可见,需要禁用深度测试才能显示...

以上是关于opentk中绘制的四边形,线,点不显示正确的主要内容,如果未能解决你的问题,请参考以下文章

iphone多边形显示数

openlayers绘制多边形

怎样在Unity 中绘制多边形

具有渐变的可绘制视图背景在预览中正确显示但在模拟器中不正确

单个glControl上的多个纹理 - openTK

在 OpenTK 中获取当前线宽