godotengine / godotengine/godot-docs
Add a minimal rendering example with RenderingDevice
- Dominant language
- reStructuredText
- Stars
- 5.7k
- Forks
- 3.8k
- Avg merge
- 1d 20h
- Merged PRs (30d)
- 25
Description
**Godot version:** 4.0.1
**Issue description:**
minimal example of Rendering with RenderingDevice
best I was able to find is this but it doesn't seem to work:
```gdscript
extends Node3D
@onready var rd := RenderingServer.get_rendering_device()
func _ready():
var shader_file: RDShaderFile = load("res://RenderTest.glsl")
var shader_spirv: RDShaderSPIRV = shader_file.get_spirv()
var shader := rd.shader_create_from_spirv(shader_spirv)
# Create format
var vertex_attrs = [RDVertexAttribute.new()]
vertex_attrs[0].format = RenderingDevice.DATA_FORMAT_R8G8B8_SNORM
vertex_attrs[0].location = 0
var vertex_format = rd.vertex_format_create(vertex_attrs)
# Create Vertex buffers
var points := PackedFloat32Array([
0, 0, 0,
0, 1, 0,
1, 1, 0,
])
var points_bytes := points.to_byte_array()
var vertex_buffers := [rd.vertex_buffer_create(points_bytes.size(), points_bytes)]
# Create vertex array
var vertex_array := rd.vertex_array_create(3, vertex_format, vertex_buffers)
# Blend
var blend = RDPipelineColorBlendState.new()
blend.attachments.push_back(RDPipelineColorBlendStateAttachment.new())
# Create empty framebuffer size of viewport
var rect_size = get_viewport().get_visible_rect().size
var screen_size = Vector2i(rect_size.x, rect_size.y)
var framebuffer = rd.framebuffer_create_empty(screen_size)
# Define pipe
var pipeline := rd.render_pipeline_create(
shader,
rd.screen_get_framebuffer_format(),
vertex_format,
RenderingDevice.RENDER_PRIMITIVE_TRIANGLES,
RDPipelineRasterizationState.new(),
RDPipelineMultisampleState.new(),
RDPipelineDepthStencilState.new(),
blend,
0
)
# Create render pipeline
if rd.render_pipeline_is_valid(pipeline):
var draw_list := rd.draw_list_begin(framebuffer, RenderingDevice.INITIAL_ACTION_DROP, RenderingDevice.FINAL_ACTION_DISCARD, RenderingDevice.INITIAL_ACTION_DROP, RenderingDevice.FINAL_ACTION_DISCARD)
# Bind pipe
rd.draw_list_bind_render_pipeline(draw_list, pipeline)
# Bind vertex array
rd.draw_list_bind_vertex_array(draw_list, vertex_array)
# Render
rd.draw_list_draw(draw_list, false, 1)
rd.draw_list_end()
else:
print("Invalid pipe")
```
```glsl
#[vertex]
#version 450 core
layout(location = 0) in vec3 vertex_attrib;
void main()
{
gl_Position = vec4(vertex_attrib, 1.0);
}
#[fragment]
#version 450 core
layout (location = 0) out vec4 frag_color;
void main()
{
//Default color
frag_color = vec4(1,1,1,1);
}
```
from [here](https://godotengine.org/qa/134841/rendering-triangle-using-renderingdevice-api)
Contributor guide
No contributing guide indexed for this repository
Assessment
This issue has not been assessed yet.