﻿<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ja">
	<id>https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3A2.8%2FSource%2FViewport%2FEngineAPI</id>
	<title>Dev:2.8/Source/Viewport/EngineAPI - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Dev%3A2.8%2FSource%2FViewport%2FEngineAPI"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:2.8/Source/Viewport/EngineAPI&amp;action=history"/>
	<updated>2026-05-06T07:50:00Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:2.8/Source/Viewport/EngineAPI&amp;diff=152679&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:2.8/Source/Viewport/EngineAPI&amp;diff=152679&amp;oldid=prev"/>
		<updated>2018-06-28T21:21:47Z</updated>

		<summary type="html">&lt;p&gt;1版 をインポートしました&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ja&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;← 古い版&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;2018年6月28日 (木) 21:21時点における版&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;ja&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(相違点なし)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Yamyam</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Dev:2.8/Source/Viewport/EngineAPI&amp;diff=152678&amp;oldid=prev</id>
		<title>wiki&gt;Hypersomniac: /* Engine API */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Dev:2.8/Source/Viewport/EngineAPI&amp;diff=152678&amp;oldid=prev"/>
		<updated>2016-12-22T21:15:28Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Engine API&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Engine API =&lt;br /&gt;
&lt;br /&gt;
This API aims to provide a simple way to create a whole Opengl/Vulkan rendering pipeline inside Blender.&lt;br /&gt;
The Engine is in charge of rendering to a buffer that will be composited with all Blender specific Overlays on top of it.&lt;br /&gt;
&lt;br /&gt;
== Drawing Pipeline ==&lt;br /&gt;
&lt;br /&gt;
The viewport drawing function would look like this (pseudo C code):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// This function pretty much dispatch object lists to passes&lt;br /&gt;
void draw_viewport(RenderEngine *re, View3D *v3d){&lt;br /&gt;
	&lt;br /&gt;
	// Setup Color and Depth buffer (always)&lt;br /&gt;
	// Create optional Framebuffers needed by the render engine&lt;br /&gt;
	// Store them in View3D&lt;br /&gt;
	setup_buffers(re, v3d);&lt;br /&gt;
&lt;br /&gt;
	if (use_probes)&lt;br /&gt;
		update_probes(re);&lt;br /&gt;
	if (use_shadows)&lt;br /&gt;
		update_shadows(re);&lt;br /&gt;
&lt;br /&gt;
	if (is_realtime_engine) {&lt;br /&gt;
		re-&amp;gt;type-&amp;gt;view_realtime(); // &amp;lt;- here we plug our render pipeline&lt;br /&gt;
	}&lt;br /&gt;
	else {&lt;br /&gt;
		re-&amp;gt;type-&amp;gt;view_draw();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// Draw wire for objects that needs it&lt;br /&gt;
	wire_pass();&lt;br /&gt;
&lt;br /&gt;
	// Draw anything Mode-related&lt;br /&gt;
	switch(mode){&lt;br /&gt;
		case OBJECT:&lt;br /&gt;
			object_pass();&lt;br /&gt;
		case EDIT:&lt;br /&gt;
			edit_pass();&lt;br /&gt;
		...&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	region_info();&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It's pretty straight forward. What we will expose to Render engines is the '''view_realtime()''' function.&lt;br /&gt;
This function will have to make draw calls to fill the color buffers that will be composited with the rest of the passes.&lt;br /&gt;
&lt;br /&gt;
== Engine API ==&lt;br /&gt;
&lt;br /&gt;
In short what a RenderEngine do is :&lt;br /&gt;
* Define glsl shaders&lt;br /&gt;
* Define needed screen buffers&lt;br /&gt;
* Create a view_realtime method that renders a frame to the viewport&lt;br /&gt;
* Create a render_ogl method that outputs a frame as final render&lt;br /&gt;
&lt;br /&gt;
In order to support a large range of techniques, the API must allow us to :&lt;br /&gt;
* Draw Geometry in batches with different states&lt;br /&gt;
* Create our own utility Shaders&lt;br /&gt;
* Get Shader from Materials Nodes&lt;br /&gt;
* Bind framebuffers&lt;br /&gt;
&lt;br /&gt;
To achieve this, we propose the following DRW module which is a wrapper of all blender's GPU modules.&lt;br /&gt;
It will be fairly high level and concise. Preferably all of what the engine can do is in this DRW module.&lt;br /&gt;
It will obviously be extended and adjusted as the engines development progresses.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// DRW_engines.h&lt;br /&gt;
&lt;br /&gt;
struct DRWBatch{&lt;br /&gt;
	DRWBatch *next, *prev;    // Linked list&lt;br /&gt;
	GPUGeometry *geometry;    // List with all objects and transform&lt;br /&gt;
	GPUShader *shader;        // Shader to bind&lt;br /&gt;
	GPUInterface *interface;  // Uniforms values&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Create custom shader to store in RenderEngineType&lt;br /&gt;
GPUShader *DRW_shader_create(char *vs_glsl, char *gs_glsl, char *fs_glsl);&lt;br /&gt;
&lt;br /&gt;
// Main draw function everything else is shortcut functions&lt;br /&gt;
// Draw a batch by switching the less resources possible&lt;br /&gt;
// flags for things like backfacecull, depth test...&lt;br /&gt;
static void DRW_draw_batch(DRWBatch *batch, int flags, ...);&lt;br /&gt;
&lt;br /&gt;
// Draw batches in order to avoid state changes&lt;br /&gt;
void DRW_draw_batch_list(ListBase *blist);&lt;br /&gt;
void DRW_draw_fullscreen(GPUShader *shader, GPUInterface *interface);&lt;br /&gt;
void DRW_draw_depth(DRWBatch *batch);&lt;br /&gt;
&lt;br /&gt;
// Frame buffer operations (for deffered rendering or other effects (DOF))&lt;br /&gt;
void DRW_bind_framebuffer(GPUFramebuffer *fb);&lt;br /&gt;
void DRW_unbind_framebuffer(GPUFramebuffer *fb);&lt;br /&gt;
&lt;br /&gt;
// Shortcut functions to draw background&lt;br /&gt;
void DRW_background_world(Scene *scene);&lt;br /&gt;
void DRW_background_default();&lt;br /&gt;
&lt;br /&gt;
// Shortcut function to batch surfaces by material (can be reused by engines that use materials)&lt;br /&gt;
ListBase *DRW_create_material_batches(ListBase *ob);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
// RE_engine.h&lt;br /&gt;
struct RenderEngineType {&lt;br /&gt;
	...&lt;br /&gt;
	void (*render_realtime)(struct RenderEngine *engine, struct Scene *scene);&lt;br /&gt;
	void (*view_realtime)(struct RenderEngine *engine, const struct bContext *context);&lt;br /&gt;
&lt;br /&gt;
	ListBase *gpushaders; // Allocated GPUShaders to draw with&lt;br /&gt;
	ListBase *gpufbdescs; // Describe each FBO to generate for this RE.&lt;br /&gt;
	...&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ideally each overlay passes (wire/overlays) should be composited on top of the render pass using different buffers.&lt;br /&gt;
As it may decrease performance and add code complexity we will try to render overlay passes to the same color buffer.&lt;br /&gt;
&lt;br /&gt;
How to expose this API through Python is still under discussion.&lt;br /&gt;
&lt;br /&gt;
== Clay Engine ==&lt;br /&gt;
&lt;br /&gt;
First example using this API is the Clay Engine.&lt;br /&gt;
&lt;br /&gt;
From the user persperctive :&lt;br /&gt;
* Not compatible with nodetree (grey nodes)&lt;br /&gt;
* Matcap is defined at Material Level with Layer override and (maybe) object override&lt;br /&gt;
* Material Panel Reflect this&lt;br /&gt;
&lt;br /&gt;
From the Engine perspective :&lt;br /&gt;
* Define matcap property inside RNA&lt;br /&gt;
* Define only one shader&lt;br /&gt;
* Optimize drawing as much as possible&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
void view_realtime(RenderEngine *re, ListBase *objs){&lt;br /&gt;
	ListBase *batches;&lt;br /&gt;
&lt;br /&gt;
	DRW_background_default(gradient);&lt;br /&gt;
&lt;br /&gt;
	// Depth Prepass performance boost depends on shading complexity and overdraw&lt;br /&gt;
	// So it might not be needed in all cases&lt;br /&gt;
	if (ao)&lt;br /&gt;
		DRW_draw_depth();&lt;br /&gt;
&lt;br /&gt;
	// Matcap rendering&lt;br /&gt;
	if (!re-&amp;gt;gpushader) {&lt;br /&gt;
		DRW_shader_create(matcap_vert_glsl, NULL, matcap_frag_glsl);&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	batches = Batch_by_matcap(objs); // Make Batches&lt;br /&gt;
&lt;br /&gt;
	// Draw Meshes&lt;br /&gt;
	DRW_draw_batch_list(batches);&lt;br /&gt;
&lt;br /&gt;
	// Post Processes&lt;br /&gt;
	DRW_fullscreen(dof_shader);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Workbench Engine ==&lt;br /&gt;
&lt;br /&gt;
* Reuse basically the same API that the Clay Engine is using&lt;br /&gt;
* Draw floor plan with drawing command&lt;br /&gt;
* Uses Custom Shadows&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Eevee Engine ==&lt;br /&gt;
&lt;br /&gt;
This one is far more complex.&lt;br /&gt;
What will be required:&lt;br /&gt;
* Getting Nodetree Materials (With new PyNode GLSL API)&lt;br /&gt;
* Transparency rendering&lt;br /&gt;
* Probe rendering&lt;br /&gt;
* Lamps Shadows&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this stage, we expect the Engine API to grow big enough to support all sort of fancy rendering this engine will support.&lt;/div&gt;</summary>
		<author><name>wiki&gt;Hypersomniac</name></author>
		
	</entry>
</feed>