# OpenGL_Basic-Draw Triangles **Repository Path**: dusk_Index/opengl_-basic_Draw_Triangles ## Basic Information - **Project Name**: OpenGL_Basic-Draw Triangles - **Description**: 基础:在.net平台opengl绘制三角形 - **Primary Language**: C# - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-01-19 - **Last Updated**: 2024-02-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: Opengl, Windows ## README # OpenGL_Basic-Draw Triangles 介绍 # OpenTK Triangle文件夹未上传完整 # 基础:在.net平台opengl绘制三角形 在.NET平台下使用OpenGL绘制三角形,你需要使用一个OpenGL的绑定库,例如OpenTK。OpenTK是一个跨平台的.NET框架,它封装了OpenGL,GLUT和GLEW等库,使得在.NET环境下使用OpenGL变得简单。首先,确保你已经安装了OpenTK库。你可以通过NuGet包管理器来安装它。在Visual Studio中,打开NuGet包管理器控制台 # 创建两个类 Window.cs和Program.cs 接下来是C#代码示例: # Window.cs如下: ``` using OpenTK.Windowing.Desktop; using OpenTK.Graphics.OpenGL4; using OpenTK.Windowing.Common; using OpenTK.Windowing.GraphicsLibraryFramework; using System; namespace OpenTK_Triangle { public class Window : GameWindow { float red, green, blue; string vertexShaderSource = @" #version 400 layout(location = 0) in vec3 aPosition; out vec4 vertexColor; void main() { gl_Position = vec4(aPosition, 1.0); vertexColor = vec4(0.0, 0.0, 0.0, 0.0); } "; string fragmentShaderSource = @"#version 400 out vec4 fragColor; uniform vec4 currentColor; void main() { fragColor = currentColor; } "; // 用于存储多个三角形的顶点数据的数组 private float[] vertices = new float[] { -0.5f, 0.5f, 0f, //三角形1 0f, -0.5f, 0f, -1.0f, -0.5f, 0f, 0.5f, 0.5f, 1f, //三角形2 1.0f, -0.5f, 1f, 0.0f, -0.5f, 1f }; // 用于存储绘制多个三角形所需的索引数据的数组 private uint[] indices = new uint[] { 0, 1, 2, 3, 4, 5 }; // 顶点缓冲对象(VBO)和顶点数组对象(VAO) private int _vertexBufferObject; private int _vertexArrayObject; private int _shaderProgram; private int _indexBufferObject; // 编译着色器源代码到着色器对象的方法 public void CompileShaders() { int vertexShader = GL.CreateShader(ShaderType.VertexShader); GL.ShaderSource(vertexShader, vertexShaderSource); GL.CompileShader(vertexShader); int fragmentShader = GL.CreateShader(ShaderType.FragmentShader); GL.ShaderSource(fragmentShader, fragmentShaderSource); GL.CompileShader(fragmentShader); _shaderProgram = GL.CreateProgram(); GL.AttachShader(_shaderProgram, vertexShader); GL.AttachShader(_shaderProgram, fragmentShader); GL.LinkProgram(_shaderProgram); GL.DetachShader(_shaderProgram, vertexShader); GL.DetachShader(_shaderProgram, fragmentShader); GL.DeleteShader(vertexShader); GL.DeleteShader(fragmentShader); } // 设置背景颜色、创建并配置VBO、VAO和IBO的方法 protected override void OnLoad() { base.OnLoad(); CompileShaders(); GL.ClearColor(0.5f, 0.4f, 0.8f, 1.0f); // 创建并绑定VBO _vertexBufferObject = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ArrayBuffer, _vertexBufferObject); GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw); // 创建并配置VAO _vertexArrayObject = GL.GenVertexArray(); GL.BindVertexArray(_vertexArrayObject); GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0); // 绑定VBO至VAO,并设置属性指针 GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0); GL.EnableVertexAttribArray(0); // 创建并绑定IBO _indexBufferObject = GL.GenBuffer(); GL.BindBuffer(BufferTarget.ElementArrayBuffer, _indexBufferObject); GL.BufferData(BufferTarget.ElementArrayBuffer, indices.Length * sizeof(uint), indices, BufferUsageHint.StaticDraw); } // 渲染帧的方法 protected override void OnRenderFrame(FrameEventArgs e) { // 清除颜色缓冲区 GL.Clear(ClearBufferMask.ColorBufferBit); // 使用已编译的着色器程序 GL.UseProgram(_shaderProgram); // 设置固定的颜色作为uniform变量(例如:红色) float constantRed = 1.0f; float constantGreen = 0.0f; float constantBlue = 0.0f; int vertexColorLocation = GL.GetUniformLocation(_shaderProgram, "currentColor"); GL.Uniform4(vertexColorLocation, constantRed, constantGreen, constantBlue, 1.0f); // 绑定VAO以准备绘制 GL.BindVertexArray(_vertexArrayObject); // 使用索引绘制三角形 GL.DrawElements(PrimitiveType.Triangles, indices.Length, DrawElementsType.UnsignedInt, 0); // 刷新颜色缓冲区到屏幕 SwapBuffers(); } protected override void OnResize(ResizeEventArgs e) { base.OnResize(e); GL.Viewport(0, 0, Size.X, Size.Y); } // Esc键关闭窗口 protected override void OnUpdateFrame(FrameEventArgs args) { base.OnUpdateFrame(args); if (KeyboardState.IsKeyDown(Keys.Escape)) Close(); } public Window(GameWindowSettings gameSettings, NativeWindowSettings nativeSettings) : base(gameSettings, nativeSettings) { } } } ``` # 接下来是program.cs: ``` using OpenTK.Windowing.Desktop; using OpenTK.Mathematics; using OpenTK.Windowing.Common; using OpenTK_Triangle; class Program { public float[] vertices; public static void Main() { Console.WriteLine("Triangle"); var nativeSettings = new NativeWindowSettings() { Title = "Shape", Size = new Vector2i(800, 600) }; using (var window = new Window(GameWindowSettings.Default, nativeSettings)) { window.Run(); } } public static float[] sendVertices() { return new float[] { // 三角形1 -0.5f, 0.5f, 0f, 0f, 0f, 1f, // 位置, 法向量 0f, -0.5f, 0f, 0f, 0f, 1f, -1.0f, -0.5f, 0f, 0f, 0f, 1f, // 三角形2 0.5f, 0.5f, 1f, 0f, 0f, 1f, 1.0f, -0.5f, 1f, 0f, 0f, 1f, 0.0f, -0.5f, 1f, 0f, 0f, 1f }; } } ``` # 如图 ![输入图片说明](image.png) # 绘制更多三角形 扩展顶点数组vertices和索引数组indices就行了