1

「本格的なゲーム作成のための C# ゲーム プログラミング」という書籍の例を調べているところ、奇妙な動作が見られます。ビューポートと正投影を設定してから、幅 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();
        }
    }
}

三角形が描画される前にプログラムが起動すると、OnClientSizeChanged イベントがトリガーされますが、ウィンドウのサイズを変更するまで、ビューポート/オルソは何も変更されないようです。

私は OpenTk ライブラリを使用し、Tao.OpenGL を含めています (ご覧のとおり)。Dock が Fill に設定されているフォームで SimpleOpenGlControl を使用しています。Windows 7 の VS2012 で実行しています。本の例にできるだけ近づけて、過剰なライブラリや余分なライブラリを使用したくありません。誰かが私が間違っていることを指摘できますか?

4

2 に答える 2