OpenGL视口设置直到调整大小才被识别

本文关键字:识别 调整 视口 设置 OpenGL | 更新日期: 2023-09-27 18:16:56

我正在浏览《c# Game Programming For Serious Game Creation》一书中的示例,并发现了一些奇怪的行为。我设置了一个视口和正射影,然后尝试画一个50px宽的三角形。一开始我只能看到三角形的一小部分,但是当我调整窗口大小时(例如,最大化然后恢复),三角形突然显示为正确的大小。

下面是一个简单的例子,再现了这个问题:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Tao.OpenGl;
namespace SimpleExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            _openGLControl.InitializeContexts();
        }
        protected override void OnClientSizeChanged(EventArgs e)
        {
            base.OnClientSizeChanged(e);
            int width = ClientSize.Width;
            int height = ClientSize.Height;
            double halfWidth = (double)width / 2;
            double halfHeight = (double)height / 2;
            Gl.glViewport(0, 0, width, height);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glLoadIdentity();
            Gl.glOrtho(-halfWidth, halfWidth, -halfHeight, halfHeight, -100, 100);
            Gl.glMatrixMode(Gl.GL_MODELVIEW);
            Gl.glLoadIdentity();
        }
        private void _openGLControl_Paint(object sender, PaintEventArgs e)
        {
            Gl.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
            Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
            {
                Gl.glColor4d(1.0, 0.0, 0.0, 0.5);
                Gl.glVertex3d(-50, 0, 0);
                Gl.glColor3d(0.0, 1.0, 0.0);
                Gl.glVertex3d(50, 0, 0);
                Gl.glColor3d(0.0, 0.0, 1.0);
                Gl.glVertex3d(0, 50, 0);
            }
            Gl.glEnd();
            Gl.glFinish();
        }
    }
}

onclientsizechange事件确实被触发当程序开始之前,三角形被绘制,但视口/ortho似乎没有改变任何东西,直到我调整窗口的大小。

我正在使用OpenTk库,包括Tao。OpenGL(如你所见)。我使用SimpleOpenGlControl在我的窗体上有Dock设置为填充。运行在VS2012在Windows 7。我希望尽可能接近书中的例子,而不使用glut或任何额外的库。有人能指出我哪里做错了吗?

OpenGL视口设置直到调整大小才被识别

改变OpenGL视图的任何方面都需要完全重新绘制场景。因为典型的OpenGL渲染将包括覆盖(HUD,注释等),所以将视口和投影矩阵与绘图分开设置是没有意义的。因此,glViewport和投影矩阵的设置应该在绘制例程中执行。

无论如何,任何窗口大小或其他观看方面的变化都必须触发完整的重绘,并且在绘制例程中设置视口和投影可以照顾到这一点,而无需进一步考虑。

我的猜测是初始的OnClientSizeChangedInitializeComponent();期间被调用,这意味着_openGLControl.InitializeContexts();尚未被调用,并且对视口的更改未应用于您的控件。因此,为了修复它,我将在您初始化控件的上下文之后设置视口。