日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)

發布時間:2025/6/17 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CSharpGL(42)借助幀緩存實現渲染到紋理(RenderToTexture)

渲染到紋理(Render To Texture)是實現很多OpenGL高級效果的一個基礎。本文記錄了如何用CSharpGL實現RTT。

下載

CSharpGL已在GitHub開源,歡迎對OpenGL有興趣的同學加入(https://github.com/bitzhuwei/CSharpGL)

開始

如圖所示,我們把teapot貼到一個矩形上了。這是借助RTT實現的。

RTT步驟如下:

  • 創建Framebuffer,這Framebuffer里包含一個Texture,這個Texture就是RTT里的Texture。
  • 綁定Framebuffer,然后正常渲染,然后解綁Framebuffer。(RTT結束)
  • 此時Framebuffer里包含的Texture已經有了想要的內容,我們可以像使用其他普通Texture一樣使用此Texture。
  • 創建Framebuffer

    Framebuffer里包含若干renderbuffer和一個depthbuffer,就像VertexArrayObject里包含若干VertexBuffer和一個IndexBuffer。

    創建Framebuffer過程概括如下:

    1 private Framebuffer CreateFramebuffer(int width, int height) 2 { 3 var texture = new Texture(TextureTarget.Texture2D, 4 new NullImageFiller(width, height, GL.GL_RGBA, GL.GL_RGBA, GL.GL_UNSIGNED_BYTE), 5 new SamplerParameters( 6 TextureWrapping.Repeat, 7 TextureWrapping.Repeat, 8 TextureWrapping.Repeat, 9 TextureFilter.Linear, 10 TextureFilter.Linear)); 11 texture.Initialize(); 12 this.BindingTexture = texture; 13 Renderbuffer colorBuffer = Renderbuffer.CreateColorbuffer(width, height, GL.GL_RGBA); 14 Renderbuffer depthBuffer = Renderbuffer.CreateDepthbuffer(width, height, DepthComponentType.DepthComponent24); 15 var framebuffer = new Framebuffer(); 16 framebuffer.Bind(); 17 framebuffer.Attach(colorBuffer);//0 18 framebuffer.Attach(texture);//1 19 framebuffer.Attach(depthBuffer);// special 20 framebuffer.SetDrawBuffers(GL.GL_COLOR_ATTACHMENT0 + 1);// as in 1 in framebuffer.Attach(texture);//1 21 framebuffer.CheckCompleteness(); 22 framebuffer.Unbind(); 23 return framebuffer; 24 }

    使用Framebuffer

    創建Framebuffer后,先綁定Framebuffer,再像平時一樣渲染,再解綁Framebuffer。

    1 public void RenderBeforeChildren(RenderEventArgs arg) 2 { 3 if (this.Width <= 0 || this.Height <= 0) { return; } 4 5 var viewport = new int[4]; 6 GL.Instance.GetIntegerv((uint)GetTarget.Viewport, viewport); 7 8 this.framebuffer = this.helper.GetFramebuffer(this.Width, this.Height); 9 framebuffer.Bind(); 10 GL.Instance.Viewport(0, 0, this.Width, this.Height); 11 { 12 int[] value = new int[4]; 13 GL.Instance.GetIntegerv((uint)GetTarget.ColorClearValue, value); 14 { 15 vec3 color = this.BackgroundColor.ToVec3(); 16 GL.Instance.ClearColor(color.x, color.y, color.z, 0.0f); // 0.0f for alpha channel, in case that transparent background is needed. 17 GL.Instance.Clear(GL.GL_COLOR_BUFFER_BIT | GL.GL_DEPTH_BUFFER_BIT | GL.GL_STENCIL_BUFFER_BIT); 18 } 19 { 20 var args = new RenderEventArgs(this.Camera); 21 foreach (var item in this.Children) 22 { 23 RenderAction.Render(item, args); 24 } 25 } 26 { 27 GL.Instance.ClearColor(value[0], value[1], value[2], value[3]);// recover clear color. 28 } 29 } 30 GL.Instance.Viewport(viewport[0], viewport[1], viewport[2], viewport[3]);// recover viewport. 31 this.framebuffer.Unbind(); 32 }

    使用RTT

    此時Framebuffer里包含的Texture已經有了想要的內容,我們可以像使用其他普通Texture一樣使用此Texture。例如本文開始處將Texture貼到一個矩形上。

    ?

    當然也可以結合Billboard的需求,把Texture貼到Billboard上。

    總結

    最近幾個月我在嘗試修整CSharpGL,感覺好多了。

    ?

    轉載于:https://www.cnblogs.com/bitzhuwei/p/CSharpGL-42-render-to-texture-via-framebuffer.html

    總結

    以上是生活随笔為你收集整理的CSharpGL(42)借助帧缓存实现渲染到纹理(RenderToTexture)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。