本文是 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);