Форум программистов, компьютерный форум, киберфорум
Наши страницы
8Observer8
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 1.

GUI WPF + OpenGL 3.1 + C#

Запись от 8Observer8 размещена 19.02.2019 в 17:36
Обновил(-а) 8Observer8 19.02.2019 в 20:57

We will see how to place OpenTK.GLControl on WPF window to make GUI application with 2D/3D graphics using modern OpenGL 3.

This is the result VS project: EditedTriangle_WPFOpenGL31CSharp.zip

Название: EditedTriangle_WPFOpenGL31CSharp_Result.png
Просмотров: 463

Размер: 4.3 Кб

How to create the project from scratch

Note 1: RMB - Right Mouse Button click
Note 2: Good Color calculator for normalized values: http://doc.instantreality.org/tools/color_calculator/
  • Create WPF application, with the name "EditedTriangle". See the screenshot:
    Screenshot
    Нажмите на изображение для увеличения
Название: EditedTriangle_WPFOpenGL31CSharp_NewProject.png
Просмотров: 47
Размер:	30.2 Кб
ID:	5219
  • Download OpenTK.zip and OpenTK.GLControl.zip
  • Create the empty "Libs" folder in the solution folder (where the ".sln" is placed)
  • Unzip "OpenTK" and "OpenTK.GLControl" folder in the "Libs" folder
  • Add references to "OpenTK.dll" and "OpenTK.GLControl.dll". For this: RMB on "References" -> select "Add Reference..." -> select "Browse" -> click the "Browse..." button -> select DLL's. See the screenshot with the result:
    Screenshot
    Нажмите на изображение для увеличения
Название: EditedTriangle_WPFOpenGL31CSharp_ReferenceManager.png
Просмотров: 43
Размер:	10.7 Кб
ID:	5221
  • Add "Assemblies". For this: select "Assemblies" -> "Framework" -> check:
    Цитата:
    System.Drawing
    System.Windows.Forms
    WindowsFormsIntegration
    , see the screenshot with the result:
    Screenshot
    Нажмите на изображение для увеличения
Название: EditedTriangle_WPFOpenGL31CSharp_Assemblies.png
Просмотров: 48
Размер:	22.5 Кб
ID:	5220
  • Click "OK" button
  • Open the file "MainWindow.xaml" in VS. Add this line as an attribute of the "Window" element:
    XML
    1
    
    xmlns:opentk="clr-namespace:OpenTK;assembly=OpenTK.GLControl"
  • Place this code inside of <Window></Window> element:
    XML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
        <Grid>
            <DockPanel LastChildFill="True">
                <StackPanel DockPanel.Dock="Right">
                    <Button x:Name="buttonSetBGColor" Content="Set BG Color" Margin="5" Click="buttonSetBGColor_Click"></Button>
                    <Button x:Name="buttonSetTRColor" Content="Set TR Color" Margin="5" Click="buttonSetTRColor_Click"></Button>
                </StackPanel>
                <WindowsFormsHost Margin="5" Initialized="WindowsFormsHost_Initialized">
                    <opentk:GLControl x:Name="glControl" Load="glControl_Load" Paint="glControl_Paint" />
                </WindowsFormsHost>
            </DockPanel>
        </Grid>
  • Copy the code below to "MainWindow.xaml.cs" and run the project

    MainWindow.xaml.cs

    C#
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    
    using System;
    using System.Windows;
    using OpenTK.Graphics.OpenGL;
    using OpenTK.Graphics;
     
    namespace EditedTriangle
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            private int _numOfVertices = 0;
            private int _uColorLocation;
     
            public MainWindow()
            {
                InitializeComponent();
            }
     
            private void glControl_Load(object sender, EventArgs e)
            {
                glControl.MakeCurrent();
     
                // Get a shader program ID
                int shaderProgram = InitShadersAndGetProgram();
     
                _numOfVertices = InitVertexBuffers();
     
                _uColorLocation = GL.GetUniformLocation(shaderProgram, "uColor");
                if (_uColorLocation < 0)
                {
                    MessageBox.Show("Failed to get uColorLocation variable");
                    return;
                }
     
                // Set a triangle color
                GL.Uniform3(_uColorLocation, 0.945f, 0.745f, 0.356f);
     
                // Set a color for clearing the glCotrol
                GL.ClearColor(new Color4(0.286f, 0.576f, 0.243f, 1f));
            }
     
            private void glControl_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
            {
                GL.Viewport(0, 0, glControl.Width, glControl.Height);
     
                // Clear the glControl with set color
                GL.Clear(ClearBufferMask.ColorBufferBit);
     
                if (_numOfVertices != 0)
                {
                    GL.DrawArrays(PrimitiveType.Triangles, 0, _numOfVertices);
                }
     
                // Swap the front and back buffers
                glControl.SwapBuffers();
            }
     
            private int InitVertexBuffers()
            {
                float[] vertices = new float[]
                {
                    0.0f, 0.5f,
                    -0.5f, -0.5f,
                    0.5f, -0.5f
                };
                int n = 3;
     
                int vbo;
                GL.GenBuffers(1, out vbo);
     
                // Get an array size in bytes
                GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);
                int sizeInBytes = vertices.Length * sizeof(float);
                // Send the vertex array to a video card memory
                GL.BufferData(BufferTarget.ArrayBuffer, sizeInBytes, vertices, BufferUsageHint.StaticDraw);
                // Config the aPosition variable
                GL.VertexAttribPointer(0, 2, VertexAttribPointerType.Float, false, 0, 0);
                GL.EnableVertexAttribArray(0);
     
                return n;
            }
     
            private int InitShadersAndGetProgram()
            {
                string vertexShaderSource =
                    "#version 140\n" +
                    "in vec2 aPosition;" +
                    "void main()" +
                    "{" +
                    "    gl_Position = vec4(aPosition, 1.0, 1.0);" +
                    "}";
     
                string fragmentShaderSource =
                    "#version 140\n" +
                    "out vec4 fragColor;" +
                    "uniform vec3 uColor;" +
                    "void main()" +
                    "{" +
                    "    fragColor = vec4(uColor, 1.0);" +
                    "}";
     
                // Vertex Shader
                int vShader = GL.CreateShader(ShaderType.VertexShader);
                GL.ShaderSource(vShader, vertexShaderSource);
                GL.CompileShader(vShader);
                // Check compilation
                string vShaderInfo = GL.GetShaderInfoLog(vShader);
                if (!vShaderInfo.StartsWith("No errors"))
                {
                    MessageBox.Show(vShaderInfo);
                    return -1;
                }
     
                // Fragment Shader
                int fShader = GL.CreateShader(ShaderType.FragmentShader);
                GL.ShaderSource(fShader, fragmentShaderSource);
                GL.CompileShader(fShader);
                string fShaderInfo = GL.GetShaderInfoLog(fShader);
                if (!fShaderInfo.StartsWith("No errors"))
                {
                    MessageBox.Show(fShaderInfo);
                    return -1;
                }
     
                int program = GL.CreateProgram();
                GL.AttachShader(program, vShader);
                GL.AttachShader(program, fShader);
                GL.LinkProgram(program);
                GL.UseProgram(program);
     
                return program;
            }
     
            private void buttonSetBGColor_Click(object sender, RoutedEventArgs e)
            {
                var dialog = new System.Windows.Forms.ColorDialog();
     
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    GL.ClearColor(dialog.Color);
                    glControl.Invalidate();
                }
     
            }
     
            private void buttonSetTRColor_Click(object sender, RoutedEventArgs e)
            {
                var dialog = new System.Windows.Forms.ColorDialog();
     
                if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    float r = dialog.Color.R / 255f;
                    float g = dialog.Color.G / 255f;
                    float b = dialog.Color.B / 255f;
                    GL.Uniform3(_uColorLocation, r, g, b);
                    glControl.Invalidate();
                }
            }
        }
    }
    MainWindow.xaml

    XML
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    
    <Window x:Class="EditedTriangle.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
            xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
            xmlns:local="clr-namespace:EditedTriangle"
            xmlns:opentk="clr-namespace:OpenTK;assembly=OpenTK.GLControl"
            mc:Ignorable="d"
            Title="Triangle" Height="256" Width="290">
        <Grid>
            <DockPanel LastChildFill="True">
                <StackPanel DockPanel.Dock="Right">
                    <Button x:Name="buttonSetBGColor" Content="Set BG Color" Margin="5" Click="buttonSetBGColor_Click"></Button>
                    <Button x:Name="buttonSetTRColor" Content="Set TR Color" Margin="5" Click="buttonSetTRColor_Click"></Button>
                </StackPanel>
                <WindowsFormsHost Margin="5">
                    <opentk:GLControl x:Name="glControl" Load="glControl_Load" Paint="glControl_Paint" />
                </WindowsFormsHost>
            </DockPanel>
        </Grid>
    </Window>
Размещено в Без категории
Просмотров 122 Комментарии 0
Всего комментариев 0
Комментарии
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru