0

我有一个有趣的事情。我想获取渲染对象的窗口坐标。当我在 OpenGLDraw 事件中使用它时:

        var modelview = new double[16];            
        gl.GetDouble(OpenGL.GL_MODELVIEW_MATRIX, modelview);

绘图不起作用。环境:VS 2019社区版,SharpGL.WinForms 3.1.1.,c# winform项目,framework 4.6.1

OpenGLControl 事件:初始化,我只需要 2D 空间。

    private void RenderPanel_OpenGLInitialized(object sender, EventArgs e)
{
    gl = RenderPanel.OpenGL;
    gl.Disable(OpenGL.GL_DEPTH_TEST);
    gl.Enable(OpenGL.GL_BLEND);
    gl.BlendFunc(OpenGL.GL_SRC_ALPHA, OpenGL.GL_ONE_MINUS_SRC_ALPHA);

    gl.LoadIdentity();
    gl.MatrixMode(OpenGL.GL_PROJECTION);
    gl.LoadIdentity();
    gl.Viewport(0, 0, RenderPanel.Width, RenderPanel.Height);
    gl.Ortho(0, RenderPanel.Width, RenderPanel.Height, 0, 1, -1);
    gl.MatrixMode(OpenGL.GL_MODELVIEW);
    gl.LoadIdentity();
}

绘制:它工作正常,绘制对象

        private void RenderPanel_OpenGLDraw(object sender, RenderEventArgs args)
    {
        gl.ClearColor(1, 1, 1, 1);
        gl.Clear(OpenGL.GL_COLOR_BUFFER_BIT | OpenGL.GL_DEPTH_BUFFER_BIT);
        gl.LoadIdentity();
        glColor(Color.White);
        gl.Enable(OpenGL.GL_TEXTURE_2D);
        foreach (ImageItem img in ImageItems.Items)
        {
            img.Draw();
        }
    }

我想在 foreach 循环中使用它,在 img.Draw() 之后(部分代码)

    var modelview = new double[16];
    var projection = new double[16];
    var viewport = new int[4];
    var winx = new double[1];
    var winy = new double[1];
    var winz = new double[1];
    gl.GetDouble(OpenGL.GL_MODELVIEW_MATRIX, modelview);
    gl.GetDouble(OpenGL.GL_PROJECTION_MATRIX, projection);
    gl.GetInteger(OpenGL.GL_VIEWPORT, viewport);
    gl.Project(0, 0, 0, modelview, projection, viewport, winx, winy, winz);

尝试调试,逐行注释。我看到使用 gl.GetDouble() 绘图时消失了。我得到一个正确的窗口坐标,只是最后一个对象消失了。.Draw() 很简单

    gl.BindTexture(OpenGL.GL_TEXTURE_2D, TextureID);
    gl.LoadIdentity();
    gl.Color(1f, 1f, 1f, pos.a);
    gl.Translate(pos.x, pos.y, 0);
    gl.Rotate(pos.r, 0, 0);
    OpenGLDraw.DrawQuad(pos.w, pos.h);
4

1 回答 1

0

这是一个错误。我将这 2 行种植到一些示例项目和绘图方法 borken(一些对象消失)。我尝试了很多事情。最后改变了renderContextType,最后一个对象出现了。我认为这不是一个好的解决方案,但有效。

于 2021-01-31T22:38:28.543 回答