当前位置: 首页 > news >正文

C# Avalonia 23- OpenGL- TriangleGlView

TriangleGlView.axaml代码

<Window xmlns="https://github.com/avaloniaui"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"Height="300" Width="300"xmlns:local="using:AvaloniaUI"x:Class="AvaloniaUI.OneTriangleMesh"Title="OneTriangleMesh"><Grid Margin="5"><Border BorderBrush="Yellow" BorderThickness="1"><local:TriangleGlView/></Border></Grid>
</Window>

TriangleGlView.axaml.cs代码

using Avalonia;
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using Avalonia.OpenGL;
using Avalonia.OpenGL.Controls;
using Avalonia.Rendering;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using System;
using System.Diagnostics;
using System.Numerics;namespace AvaloniaUI;public sealed class TriangleGlView : OpenGlControlBase
{private int program;private int vao;private int vbo;protected override void OnOpenGlInit(GlInterface gl){GL.LoadBindings(new BindingsContext(gl));GL.Disable(EnableCap.DepthTest);CreateTriangle();CreateProgram();//这个版本和version 300 es对应var version = GL.GetString(StringName.Version);var sl = GL.GetString(StringName.ShadingLanguageVersion);var renderer = GL.GetString(StringName.Renderer);var vendor = GL.GetString(StringName.Vendor);Console.WriteLine($"GL_VERSION: {version}");Console.WriteLine($"GLSL: {sl}");Console.WriteLine($"Renderer: {renderer}");Console.WriteLine($"Vendor: {vendor}");}protected override void OnOpenGlDeinit(GlInterface gl){if (program != 0) GL.DeleteProgram(program);if (vbo != 0) GL.DeleteBuffer(vbo);if (vao != 0) GL.DeleteVertexArray(vao);program = 0;vbo = 0;vao = 0;}protected override void OnOpenGlRender(GlInterface gl, int fb){//RequestNextFrameRendering();var width = Math.Max(1, (int)Bounds.Width);var height = Math.Max(1, (int)Bounds.Height);GL.Viewport(0, 0, width, height);GL.ClearColor(0.5f, 0.5f, 0.5f, 1f);GL.Clear(ClearBufferMask.ColorBufferBit);GL.UseProgram(program);GL.BindVertexArray(vao);GL.DrawArrays(PrimitiveType.Triangles, 0, 3);}private void CreateTriangle(){var vertices = new[]{-0.8f, -0.6f, 0f,0.0f,  0.8f, 0f,0.8f, -0.6f, 0f};vao = GL.GenVertexArray();vbo = GL.GenBuffer();GL.BindVertexArray(vao);GL.BindBuffer(BufferTarget.ArrayBuffer, vbo);GL.BufferData(BufferTarget.ArrayBuffer, vertices.Length * sizeof(float), vertices, BufferUsageHint.StaticDraw);GL.EnableVertexAttribArray(0);GL.VertexAttribPointer(0, 3, VertexAttribPointerType.Float, false, 3 * sizeof(float), 0);}private void CreateProgram(){var vsSource = """#version 300 eslayout(location=0) in vec3 aPos;void main(){gl_Position = vec4(aPos, 1.0);}""";var fsSource =  """#version 300 esprecision mediump float;out vec4 FragColor;void main(){FragColor = vec4(1.0, 1.0, 0.0, 1.0);}""";var vs = CompileShader(ShaderType.VertexShader, vsSource);var fs = CompileShader(ShaderType.FragmentShader, fsSource);program = GL.CreateProgram();GL.AttachShader(program, vs);GL.AttachShader(program, fs);GL.LinkProgram(program);GL.GetProgram(program, GetProgramParameterName.LinkStatus, out var linked);if (linked == 0){var log = GL.GetProgramInfoLog(program);GL.DeleteProgram(program);program = 0;throw new InvalidOperationException($"Link failed: {log}");}GL.DetachShader(program, vs);GL.DetachShader(program, fs);GL.DeleteShader(vs);GL.DeleteShader(fs);}private static int CompileShader(ShaderType type, string source){var shader = GL.CreateShader(type);GL.ShaderSource(shader, source);GL.CompileShader(shader);GL.GetShader(shader, ShaderParameter.CompileStatus, out var ok);if (ok == 0){var log = GL.GetShaderInfoLog(shader);GL.DeleteShader(shader);throw new InvalidOperationException($"{type} compile failed: {log}");}return shader;}private sealed class BindingsContext(GlInterface gl) : IBindingsContext{public IntPtr GetProcAddress(string procName) => gl.GetProcAddress(procName);}
}
public partial class OneTriangleMesh : Window
{public OneTriangleMesh(){InitializeComponent();}
}

运行效果

image

 

http://www.jsqmd.com/news/1363872/

相关文章:

  • 软件配置治理核心原则与实践:从分离、安全到审计的完整指南
  • 终极指南:如何3分钟完成Windows和Office永久激活解决方案
  • Vibe Coding入门指南:非程序员如何用AI对话开发软件
  • PyTorch Java张量广播机制详解:从原理到AI工程实践
  • Java缓存技术深度解析:从本地到分布式实战
  • Kubernetes Deployment与Service整合优化实战指南
  • AI Agent长期记忆系统构建:从向量检索到阿里云实战
  • 2026年8月免熏蒸包装箱/杭州UN危包包装售后无忧公司_杭州欣邦包装有限公司 - 品牌宣传支持者
  • 软件开发框架架构设计:核心模式与技术选型指南
  • 如何5分钟永久保存QQ空间所有青春记忆:GetQzonehistory免费工具终极指南
  • 终极解决Visual C++运行时多版本共存:架构设计与实战部署
  • 从无标题到智能温控:项目开发全流程解析
  • Grok Imagine Image 2.0本地部署指南:从扩散模型原理到API集成实践
  • 追觅全球化启示:从高速马达到智能清洁生态的体系化竞争
  • Redis缓存穿透、雪崩与击穿问题解决方案
  • LE Audio技术解析:蓝牙音频低延迟与多设备连接方案
  • AI Agent存储架构演进:从云端到本地的文件系统核心价值与实践
  • MySQL时间类型选型:timestamp与datetime实战对比
  • Forge框架开发Minecraft模组全流程指南
  • 5分钟快速指南:如何免费永久激活Windows和Office系统
  • 2026年8月济南全包装修/济南精装房装修公司优选推荐_山东世纪宏达绿诺星科装饰有限公司 - 行业平台推荐
  • C#实现智能象棋游戏:从规则引擎到AI算法的完整开发指南
  • 2026年8月陕西砌筑砂浆/水泥路面快速修补砂浆行业公司推荐_陕西中顺泰建筑材料有限公司 - 品牌宣传支持者
  • 基于MCP协议构建Nacos配置对比工具,实现AI驱动的微服务配置管理
  • 高性能计算十年演进:从千万亿次到百亿亿次的跨越
  • 2026年8月alc隔墙板/轻质隔墙板公司推荐盘点_青海正格建筑安装工程有限公司 - 行业平台推荐
  • 番茄小说下载器:三步实现离线阅读自由
  • 2026年8月湖南PU输送带/PVC输送带公司**单_湖南金锋工业皮带有限公司 - 品牌宣传支持者
  • Vector+VictoriaLogs构建高性能日志采集分析系统
  • 领域建模实战:从可继承、可转让、可抵押资产模型解析所有权与产权的技术实现差异