借助OpenTK开启OpenGL之旅

网上搜了不少资料,可操作性弱。

在C#环境下可用的OpenGL包有OpenTK、SharpGL,今天使用OpenTK做一个练习。

首先来接一下OpenTK:

The Open Toolkit is set of fast, low-level C# bindings for OpenGL, OpenGL ES, OpenAL and OpenCL. It runs on all major platforms and powers hundreds of apps, games and scientific research.  It provides bindings for GLFW windowing, input and a game loop, and is the perfect start for your own game engine.  OpenTK comes with simple and easy to follow tutorials for learning *modern* OpenGL. These are written by the community and represent all of the best practices to get you started.  Learn how to use OpenTK here:  https://opentk.net/learn/index.html  Sample projects that accompany the tutorial can be found here:  https://github.com/opentk/LearnOpenTK  We have a very active discord server, if you need help, want to help, or are just curious, come join us!  https://discord.gg/6HqD48s

明确方向:

OpenTK 3 (.NET framework)

OpenTK 4 (.NET core 3.1+)

OpenTK 5 (.NET 5+)

在.Net Frameowk下使用OpenTK 3

目前最新版本是3.3.2

建立Console Application项目

项目环境Netframe:V4.6.1

使用Nuget包管理器为项目安装包OpenTK 3.3.2

建立一个类Game(Game.cs):

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OpenTK;
using System.Drawing;
using OpenTK.Graphics.OpenGL;
using OpenTK.Graphics;

namespace OpenTKTest
{
    class Game: GameWindow
    {
        public Game() : base(1200, 900, GraphicsMode.Default, "第一个窗口", GameWindowFlags.Default, DisplayDevice.Default, 4, 0, GraphicsContextFlags.ForwardCompatible)
        {
            Title += ": OpenGL Version: " + GL.GetString(StringName.Version);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            Title = "Hello OpenTK!";

            GL.ClearColor(Color.CornflowerBlue);
        }

        protected override void OnRenderFrame(FrameEventArgs e)
        {
            base.OnRenderFrame(e);

            GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

            /* The first thing we need to do is to tell OpenGL which direction we're looking at.
             * Because we'll be actually making something in 3D, the direction the camera faces is important. */
            Matrix4 modelview = Matrix4.LookAt(Vector3.Zero, Vector3.UnitZ, Vector3.UnitY);
            GL.MatrixMode(MatrixMode.Modelview);
            GL.LoadMatrix(ref modelview);


            /* Now we'll want to draw the triangle itself.
             * The first step is to tell OpenGL we want to draw something. We do this with the GL.Begin function.
             * This takes a single parameter, which is the drawing mode to use.
             * There are options to draw quadrilaterals, triangles, points, polygons, and "strips".*/
            GL.Begin(PrimitiveType.Triangles);

            /* Now that we've told it how we want to draw, we need to give it the vertices for our shape.
             * To do this, we use the GL.Vertex3 function. It takes three floats as coordinates for a single point in 3D space.*/
            GL.Color3(1.0f, 0.0f, 0.0f); 
            GL.Vertex3(-1.0f, -1.0f, 4.0f);

            GL.Color3(0.0f, 1.0f, 0.0f);
            GL.Vertex3(1.0f, -1.0f, 4.0f);

            GL.Color3(0.0f, 0.0f, 1.0f); 
            GL.Vertex3(0.0f, 1.0f, 4.0f);   

            GL.End();

            //GL.Clear(ClearBufferMask.ColorBufferBit);

             操纵模型视图矩阵,设置眼球参数
            //GL.MatrixMode(MatrixMode.Modelview);
            //GL.LoadIdentity();

             设置观察者参数
            //Matrix4 mx4 = Matrix4.LookAt(0f, 0f, 5f, 0f, 0f, 0f, 0f, 1f, 0f);
            //GL.MatrixMode(MatrixMode.Modelview);
            //GL.LoadMatrix(ref mx4);
             绘制图形
            GL.Begin(BeginMode.Polygon);
            //GL.Begin(PrimitiveType.Polygon);
            //GL.Vertex3(-1.0f, -1.0f, 2.0f);
            //GL.Vertex3(1.0f, -1.0f, 2.0f);
            //GL.Vertex3(1.0f, 1.0f, 2.0f);
            //GL.Vertex3(-1.0f, 1.0f, 2.0f);
            //GL.End();

            SwapBuffers();
        }

        protected override void OnResize(EventArgs e)
        {
            /* OpenGL needs to be told how to adjust for the new window size, so we need some code that handles it. */
            base.OnResize(e);

            GL.Viewport(ClientRectangle.X, ClientRectangle.Y, ClientRectangle.Width, ClientRectangle.Height);

            Matrix4 projection = Matrix4.CreatePerspectiveFieldOfView((float)Math.PI / 4, Width / (float)Height, 1.0f, 64.0f);
            GL.MatrixMode(MatrixMode.Projection);
            GL.LoadMatrix(ref projection);
        }
    }
}


控制台代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace OpenTKTest
{
    class Program
    {
        static void Main(string[] args)
        {
            using (Game game = new Game())
            {
                /*The Run method of the GameWindow has multiple overloads.
                 * With a single float parameter, Run will give your window 30 UpdateFrame events a second, and as many RenderFrame events per second as the computer will process.*/
                game.Run(30.0);
            }
        }
    }
}


 

运行效果:

 另外一个动态效果展示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_16215957

如果有帮助一杯咖啡奶茶均可

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值