目的:
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。由于没有更多的设置,所以看到的只是一块面。
最后,完整的代码如下:
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