Какой метод внутри GameWindow мы переопределяем для рисования объекта с помощью OpenTK?

#c# #opengl #opentk

#c# #opengl #opentk

Вопрос:

Проблема

Я занимаюсь исследованием дизайна среды для видеоигр, и так получилось, что я начал с основ OpenGL с OpenTk — варианта C # OpenGL . Я получил код для рисования объекта cube в моем GameWindow OpenTk с помощью этого сайта. Я переопределяю метод OnLoad для своего GameWindow объекта и вызываю метод для рисования куба, но ничего не происходит, код рисует GameWindow и NativeWIndow без какого-либо графического объекта.

Ожидания

Я ожидал, что код нарисует куб внутри GameWindow объекта.

Примененный код

 //extend the GameWindow object to access methods from the super
class MyWindow : GameWindow
{
    public MyWindow(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings)
    {
        WindowState = OpenTK.Windowing.Common.WindowState.Maximized;
    }

    //when the window is loaded, draw the cube
    protected override void OnLoad()
    {
        this.DrawBox(10);

    }
    //method to draw the cube 
    private void DrawBox(float size)
    {
        float[,] n = new float[,]{
            {-1.0f, 0.0f, 0.0f},
            {0.0f, 1.0f, 0.0f},
            {1.0f, 0.0f, 0.0f},
            {0.0f, -1.0f, 0.0f},
            {0.0f, 0.0f, 1.0f},
            {0.0f, 0.0f, -1.0f}
        };
        int[,] faces = new int[,]{
            {0, 1, 2, 3},
            {3, 2, 6, 7},
            {7, 6, 5, 4},
            {4, 5, 1, 0},
            {5, 6, 2, 1},
            {7, 4, 0, 3}
        };
        float[,] v = new float[8, 3];
        int i;

        v[0, 0] = v[1, 0] = v[2, 0] = v[3, 0] = -size / 2;
        v[4, 0] = v[5, 0] = v[6, 0] = v[7, 0] = size / 2;
        v[0, 1] = v[1, 1] = v[4, 1] = v[5, 1] = -size / 2;
        v[2, 1] = v[3, 1] = v[6, 1] = v[7, 1] = size / 2;
        v[0, 2] = v[3, 2] = v[4, 2] = v[7, 2] = -size / 2;
        v[1, 2] = v[2, 2] = v[5, 2] = v[6, 2] = size / 2;

        GL.Begin(BeginMode.Quads);
        for (i = 5; i >= 0; i--)
        {
            GL.Normal3(ref n[i, 0]);
            GL.Vertex3(ref v[faces[i, 0], 0]);
            GL.Vertex3(ref v[faces[i, 1], 0]);
            GL.Vertex3(ref v[faces[i, 2], 0]);
            GL.Vertex3(ref v[faces[i, 3], 0]);
        }
        GL.End();
    }
}
//instantiation in the main method
 GameWindowSettings gameWindowSettings= new GameWindowSettings();
 NativeWindowSettings nativeWindowSettings = new NativeWindowSettings();
gameWindowSettings.IsMultiThreaded = false;

new MyWindow(gameWindowSettings, nativeWindowSettings).Run();
 

Пожалуйста, помогите мне сделать эту работу.

Ответ №1:

Вы должны реализовать OnUpdateFrame обратный вызов события. Вам также необходимо вызвать Context.SwapBuffers(); , чтобы обновить отображение:

 class MyWindow : GameWindow
{
    // [...]

    protected override void OnUpdateFrame(FrameEventArgs e)
    {
        GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

        this.DrawBox(0.5f);

        Context.SwapBuffers();
        base.OnUpdateFrame(e);
    }
}
 

Если вы не используете проекционную матрицу, координаты должны быть в диапазоне [-1.0, 1.0]. Нормализованное пространство устройства представляет собой уникальный куб с левым, нижним, ближним углом (-1, -1, -1) и правым, верхним, дальним углом (1, 1, 1). Без матрицы проекции этот куб также является объемом просмотра (пространство, которое проецируется на область просмотра).

Поскольку вы используете устаревший OpenGL ( glBegin / glEnd ), вам необходимо создать профиль совместимости OpenGL Context:

 nativeWindowSettings.API = ContextAPI.OpenGL;
nativeWindowSettings.Profile = ContextProfile.Compatability;
 

См. c_sharp_opengl / OpenTK_hello_triangle для очень простого примера использования «современного» OpenGL.

Комментарии:

1. @KINYUATIMOTHYNJIRU Это новый вопрос. Подсказка GL.Color3 (установите цвет перед рисованием одной стороны куба). Вы также должны узнать о перспективной проекции. Я рекомендую прочитать хороший учебник. Мой любимый — LearnOpenGL . См. Также Rabbid76/c_sharp_opengl .