八、OpenTK中的纹理操作(万字详细教程)


一、纹理加载和创建

(一)从图像文件加载纹理(如 PNG、JPEG)

  在图形渲染中,纹理可以从图像文件加载。通常使用图像处理库来读取图像文件的像素数据,并将其上传到 GPU 作为纹理。在 C# 中,可以使用一些第三方库(如 System.Drawing.Common 或 SixLabors.ImageSharp)来读取图像文件。首先,读取图像文件并获取其像素数据。然后,创建一个纹理对象,并使用 GL.TexImage2D 函数将像素数据上传到 GPU。同时,需要设置纹理的参数,如过滤模式和环绕模式。
  以下是一个从 PNG 图像文件加载纹理的 C# 示例代码:

using OpenTK;
using OpenTK.Graphics;
using OpenTK.Graphics.Open
  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
C# 使用 OpenTK 库设置纹理透明度,你需要使用一个包含透明通道的纹理图像,并且要启用透明度混合(blending)。 以下是一个示例代码,展示了如何在使用 OpenTK 绘制纹理时设置纹理的透明度: ```csharp using System; using OpenTK; using OpenTK.Graphics; using OpenTK.Graphics.OpenGL; using OpenTK.Input; namespace TextureTransparency { class Game : GameWindow { private int textureId; public Game() : base(800, 600, GraphicsMode.Default, "Texture Transparency") { } protected override void OnLoad(EventArgs e) { base.OnLoad(e); // 加载纹理图像 textureId = LoadTexture("path_to_texture.png"); // 启用透明度混合 GL.Enable(EnableCap.Blend); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); } protected override void OnRenderFrame(FrameEventArgs e) { base.OnRenderFrame(e); GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit); // 绑定纹理 GL.BindTexture(TextureTarget.Texture2D, textureId); // 绘制一个矩形(使用纹理坐标) GL.Begin(PrimitiveType.Quads); GL.TexCoord2(0, 0); GL.Vertex2(-0.5f, -0.5f); GL.TexCoord2(1, 0); GL.Vertex2(0.5f, -0.5f); GL.TexCoord2(1, 1); GL.Vertex2(0.5f, 0.5f); GL.TexCoord2(0, 1); GL.Vertex2(-0.5f, 0.5f); GL.End(); SwapBuffers(); } protected override void OnUnload(EventArgs e) { base.OnUnload(e); // 删除纹理 GL.DeleteTexture(textureId); } private int LoadTexture(string path) { // 使用 OpenTK纹理加载方法(你也可以使用其他加载纹理的方法) Bitmap bitmap = new Bitmap(path); int textureId; GL.GenTextures(1, out textureId); GL.BindTexture(TextureTarget.Texture2D, textureId); BitmapData data = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0); bitmap.UnlockBits(data); // 设置纹理参数 GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear); GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear); return textureId; } static void Main(string[] args) { using (Game game = new Game()) { game.Run(60.0); } } } } ``` 在这个示例,我们使用 OpenTK 创建一个窗口,并在 OnLoad 方法加载纹理图像。我们使用 `GL.Enable(EnableCap.Blend)` 启用透明度混合,并且使用 `GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha)` 设置混合函数,以便正确处理透明度。 在 OnRenderFrame 方法,我们绑定纹理并使用纹理坐标绘制一个矩形。注意,要使用具有透明通道的纹理图像。 最后,在 OnUnload 方法,我们删除纹理。 请记得将 "path_to_texture.png" 替换为你的纹理图像的实际路径。确保添加 OpenTK 和 System.Drawing 的引用,并将纹理图像添加到你的项目。 运行应用程序后,应该会显示具有透明度的纹理图像。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

0仰望星空007

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值