本文是 https://www.bilibili.com/video/BV1ZChGz8EkH 視頻的筆記。
Godot 中在使用 Forword+ 時候,引入了 Render Pipeline
與其有關的還有 Compositor
https://docs.godotengine.org/en/stable/classes/class_renderingdevice.html
https://docs.godotengine.org/en/stable/tutorials/rendering/compositor.html
手動創建一個 Render Pipeline
頂點緩沖區對象 VBO
var vertex : PackedFloat32Array = [
0.0, -1.0, # 0
-1.0, 1.0, # 1
1.0, 1.0 # 2
]
var vertex_bytes : PackedByteArray = vertex.to_byte_array();
vertex_buffer = rd.vertex_buffer_create
頂點數組對象 VAO
VAO 是用于描述 VBO 的結構布局
幀緩存對象 FBO
幀緩存對象表示渲染管線的渲染目標紋理
var frametexture_format : RDTextureFormat = RDTextureFormat.new();
frametexture_format.format = RenderingDevice.DATA_ R32G32B32A32_SFLOAT;
frametexture.width = 512;
frametexture.height = 512;
frametexture.usage_bits = \
RenderingDevice.TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | \ # 需要指定此紋理可用作幀緩沖對象中的顏色附件
RenderingDevice.TEXTURE_USAGE_CAN_COPY_FROM_BIT;
framebuff_texture = rd.texture_create(frametexture_format, RDTextureView.new()); # 1. 創建一個圖形 API 紋理
# 創建完紋理對象,就可以創建幀緩沖對象了
# 幀緩沖對象類似于一個紋理集合,圖像作為“附件”附加到幀緩沖對象上
# 渲染管線會將渲染出來的不同的結果,存儲到幀緩沖對象中的不同的附件上
# 這里將 **顏色附件紋理** 傳入,Godot 會根據傳入的附件類型自動推斷幀緩沖格式
var framebuffers : Array[RID] = [ framebuffer_texture ];
framebuffer = rd.framebuff_create(framebuffers);
編寫 glsl
提交到 GPU
調度 GPU 執行圖形渲染,并等待同步
rd.submit();
rd.sync();
獲取幀緩沖的顏色附件紋理數據并顯示
var data : PackedByteArray = rd.texture_get_data(framebuffer_texture, 0);
var img : Image = Image.create_from_data(512, 512, false, Image.FORMAT_RGBAF, data);
$TextureRect.texture = ImageTexture.create_from_image(img);