我有一个有趣的事情。我想获取渲染对象的窗口坐标。当我在 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);