【OpenGL】C#搭建OpenGL开发环境

 

 

目的:

1、在C#环境下搭建OpenGL的开发环境。

2、实现一个简单的shader。

 

工具:

1、Visual Studio 2017

 

步骤:

1、打开Visual Studio,新建个工程,winform或者控制台均可。

2、安装Giawa.OpenGL和Giawa.OpenGL.Platform。

这2个库来自于一个开源工程,叫opengl4csharp。Github地址:https://github.com/giawa/opengl4csharp

在nuget里面搜索安装即可。

3、下载SDL2.dll并添加到bin目录里面。

下载地址:

https://www.libsdl.org/download-2.0.php

注意默认要下载x86的,如果需要64的,就再下载。

4、创建OpenGL窗体

在程序启动的时候加入以下代码:

            // create an OpenGL window
            OpenGL.Platform.Window.CreateWindow("OpenGL", 1280, 720);

            // handle events and render the frame
            while (OpenGL.Platform.Window.Open)
            {
                OpenGL.Platform.Window.HandleEvents();
                OnRenderFrame();
            }

其中,OnRenderFrame可以先创建个空函数,后面会用到

此时运行,会出现个黑乎乎的窗体,即表明基础环境搭建成功。

5、创建着色器

顶点着色器:

        public static string vertexShader2Source = @"
            uniform mat4 projection_matrix;
            uniform mat4 modelview_matrix;

            attribute vec3 in_position;
            void main(void)
            {
              gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
            }
        ";

片元着色器

        public static string fragmentShader2Source = @"
            uniform vec3 color;

            void main(void)
            {
              gl_FragColor = vec4(color, 1);
            }
        ";

创建着色器程序,注意要写在createWindow后面

          // create the shader program
            ShaderProgram program = new ShaderProgram(vertexShader2Source, fragmentShader2Source);

            // set the color to blue
            program["color"].SetValue(new Vector3(0, 0, 1));

6、画一个cube。注意要在主循环前面写

            // set up some defaults for the shader program project and modelview matrices
            program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width / height, 0.1f, 1000f));
            program["modelview_matrix"].SetValue(Matrix4.CreateTranslation(new Vector3(2, 2, -10)) * Matrix4.CreateRotation(new Vector3(1, -1, 0), 0.2f));

            // create a cube
            cube = OpenGL.Geometry.CreateCube(program, new Vector3(-1, -1, -1), new Vector3(1, 1, 1));

7、在主循环中运行

       void OnRenderFrame() {
            Gl.Viewport(0, 0, width, height);
            Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            cube.Program.Use();
            cube.Draw();

            OpenGL.Platform.Window.SwapBuffers();
        }

这个时候运行,即可看到一个cube。由于没有更多的设置,所以看到的只是一块面。

【OpenGL】C#搭建OpenGL开发环境

 

最后,完整的代码如下:

using OpenGL;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace OpenGLForWinformDemo
{
    public partial class Form1 : Form
    {
        public static string vertexShader2Source = @"
            uniform mat4 projection_matrix;
            uniform mat4 modelview_matrix;

            attribute vec3 in_position;
            void main(void)
            {
              gl_Position = projection_matrix * modelview_matrix * vec4(in_position, 1);
            }
        ";

        public static string fragmentShader2Source = @"
            uniform vec3 color;

            void main(void)
            {
              gl_FragColor = vec4(color, 1);
            }
        ";

        public VAO cube;
        int width = 1000;
        int height = 500;

        public Form1()
        {
            InitializeComponent();



            // create an OpenGL window
            OpenGL.Platform.Window.CreateWindow("OpenGL", 1280, 720);

            // create the shader program
            ShaderProgram program = new ShaderProgram(vertexShader2Source, fragmentShader2Source);

            // set the color to blue
            program["color"].SetValue(new Vector3(0, 0, 1));


            // set up some defaults for the shader program project and modelview matrices
            program["projection_matrix"].SetValue(Matrix4.CreatePerspectiveFieldOfView(0.45f, (float)width / height, 0.1f, 1000f));
            program["modelview_matrix"].SetValue(Matrix4.CreateTranslation(new Vector3(2, 2, -10)) * Matrix4.CreateRotation(new Vector3(1, -1, 0), 0.2f));

            // create a cube
            cube = OpenGL.Geometry.CreateCube(program, new Vector3(-1, -1, -1), new Vector3(1, 1, 1));

            // handle events and render the frame
            while (OpenGL.Platform.Window.Open)
            {
                OpenGL.Platform.Window.HandleEvents();
                OnRenderFrame();
            }
        }

        void OnRenderFrame() {
            Gl.Viewport(0, 0, width, height);
            Gl.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            cube.Program.Use();
            cube.Draw();

            OpenGL.Platform.Window.SwapBuffers();
        }
    }
}

 

SDL的解释,摘自百度:

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。

 

参考资料:

https://github.com/giawa/opengl4csharp

 

 

上一篇:分享一篇gamedev的关于opengl绘制数据组织的文章


下一篇:OpenGL代码学习(1)