﻿<?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=Shader_Pynodes_for_Blender_2.8</id>
	<title>Shader Pynodes for Blender 2.8 - 版の履歴</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.blender.jp/index.php?action=history&amp;feed=atom&amp;title=Shader_Pynodes_for_Blender_2.8"/>
	<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Shader_Pynodes_for_Blender_2.8&amp;action=history"/>
	<updated>2026-09-02T21:58:02Z</updated>
	<subtitle>このウィキのこのページに関する変更履歴</subtitle>
	<generator>MediaWiki 1.31.0</generator>
	<entry>
		<id>https://wiki.blender.jp/index.php?title=Shader_Pynodes_for_Blender_2.8&amp;diff=152781&amp;oldid=prev</id>
		<title>Yamyam: 1版 をインポートしました</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Shader_Pynodes_for_Blender_2.8&amp;diff=152781&amp;oldid=prev"/>
		<updated>2018-06-28T21:21:56Z</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=Shader_Pynodes_for_Blender_2.8&amp;diff=152780&amp;oldid=prev</id>
		<title>wiki&gt;Dal: /* Here is rough roadmap for shader pynodes developing. */</title>
		<link rel="alternate" type="text/html" href="https://wiki.blender.jp/index.php?title=Shader_Pynodes_for_Blender_2.8&amp;diff=152780&amp;oldid=prev"/>
		<updated>2017-04-03T15:51:23Z</updated>

		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Here is rough roadmap for shader pynodes developing.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新規ページ&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[https://wiki.blender.org/index.php/Dev:2.8/Source/Viewport/PyNodeGLSL Main Specification]&lt;br /&gt;
&lt;br /&gt;
== Here is rough roadmap for shader pynodes developing. ==&lt;br /&gt;
# ✔ Make simple custom Render engine with one input and output (e.g. Geometry from Cycles and Output) nodes.&lt;br /&gt;
# ✔ Make it possible to implement the following node method with python: NodeGPUExecFunction gpufunc.&lt;br /&gt;
# ✔ Port gpu_stack_link etc&lt;br /&gt;
# ✔ Implement Geometry and Output nodes using functions ported in previous point&lt;br /&gt;
# Implement Texture node (API for texture passing), - waiting for D113&lt;br /&gt;
# ✔ Implement procedural texture node&lt;br /&gt;
# Handle bl_compatibility&lt;br /&gt;
## ✔ automatic generation of &amp;quot;ADD&amp;quot; menu&lt;br /&gt;
## &amp;quot;add compatibility&amp;quot; API for existing nodes&lt;br /&gt;
### ✔ New node for old engine: add support for non-native engine libs&lt;br /&gt;
### ✔ Old node for new engine&lt;br /&gt;
### Gray out non-compatible nodes&lt;br /&gt;
## ✔ use common set for node items in add menu, handled by compatible() method of node class&lt;br /&gt;
# Implement all stuff for shader common code, defined in Render Engine class:&lt;br /&gt;
## ✔ Parse bl_gpu_library&lt;br /&gt;
## bl_use_realtime_engine&lt;br /&gt;
## bl_gpu_features&lt;br /&gt;
## bl_gpu_converts&lt;br /&gt;
## reconstruct_glsl_library&lt;br /&gt;
# Port Cycles nodes to python&lt;br /&gt;
# ✔ Handle Muting (update_internal_links): allow default behavior for all shader nodes, disable muting for &amp;quot;Output&amp;quot; category&lt;br /&gt;
# Handle blend file compatibility&lt;br /&gt;
&lt;br /&gt;
== Current State ==&lt;br /&gt;
Geometry, Output, Passthrough nodes are implemented using python.&lt;br /&gt;
&lt;br /&gt;
[[File:Py_shaders_begining.gif]]&lt;br /&gt;
&lt;br /&gt;
=== Python example (not complete, but sufficient for API review) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
class PyGLSLRender(bpy.types.RenderEngine):&lt;br /&gt;
    bl_idname = 'PyGLSL'&lt;br /&gt;
    bl_label = &amp;quot;PyGLSL Render&amp;quot;&lt;br /&gt;
    bl_use_shading_nodes = True&lt;br /&gt;
    bl_use_preview = False&lt;br /&gt;
    bl_use_shading_nodes_custom = False&lt;br /&gt;
&lt;br /&gt;
class PyGLSLNode:&lt;br /&gt;
    @classmethod&lt;br /&gt;
    def poll(cls, ntree):&lt;br /&gt;
        return ntree.bl_idname == 'PyGLSL'&lt;br /&gt;
&lt;br /&gt;
class PyGLSL_node_geom(bpy.types.ShaderNode, PyGLSLNode):&lt;br /&gt;
&lt;br /&gt;
    bl_idname = 'PyGLSL_node_geom'&lt;br /&gt;
    bl_label = 'PyGLSL Geometry'&lt;br /&gt;
    bl_compatibility={'CYCLES', 'PyGLSL'}&lt;br /&gt;
    bl_category = &amp;quot;Input&amp;quot;&lt;br /&gt;
    bl_class = &amp;quot;INPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    def gpufunc(self, ins, outs):&lt;br /&gt;
        v_pos = GPULink(builtins.GPU_VIEW_POSITION)&lt;br /&gt;
        v_nor = GPULink(builtins.GPU_VIEW_NORMAL)&lt;br /&gt;
        i_vmat = GPULink(builtins.GPU_INVERSE_VIEW_MATRIX)&lt;br /&gt;
&lt;br /&gt;
        return GPU_link_stack(self, &amp;quot;node_geometry&amp;quot;, ins, outs, v_pos, v_nor, i_vmat)&lt;br /&gt;
&lt;br /&gt;
    def init(self, context):&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Position&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Normal&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Tangent&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;True Normal&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Incoming&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Parametric&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketFloat&amp;quot;, &amp;quot;Backfacing&amp;quot;)&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketFloat&amp;quot;, &amp;quot;Pointiness&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
passthrough_lib ='''&lt;br /&gt;
void pass_through(vec3 col, out vec3 outcol)&lt;br /&gt;
{&lt;br /&gt;
    outcol = col;&lt;br /&gt;
}&lt;br /&gt;
'''&lt;br /&gt;
class PyGLSL_node_passthrough(bpy.types.ShaderNode, PyGLSLNode):&lt;br /&gt;
&lt;br /&gt;
    bl_idname = 'PyGLSL_node_passthrough'&lt;br /&gt;
    bl_label = 'PyGLSL Passthrough'&lt;br /&gt;
    bl_compatibility = {'CYCLES', 'PyGLSL'}&lt;br /&gt;
    bl_category = &amp;quot;Converter&amp;quot;&lt;br /&gt;
    bl_gpu_code = {&amp;quot;CYCLES&amp;quot;: passthrough_lib, 'PyGLSL': passthrough_lib}&lt;br /&gt;
&lt;br /&gt;
    def gpufunc(self, ins, outs):&lt;br /&gt;
        i = GPULink(ins.array[0])&lt;br /&gt;
        o = GPULink(outs.array[0])&lt;br /&gt;
        ret = GPU_link(&amp;quot;pass_through&amp;quot;, [i, o])&lt;br /&gt;
        return ret&lt;br /&gt;
&lt;br /&gt;
    def init(self, context):&lt;br /&gt;
        s = self.inputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;In&amp;quot;)&lt;br /&gt;
        s.hide_value = True&lt;br /&gt;
        self.outputs.new(&amp;quot;NodeSocketVector&amp;quot;, &amp;quot;Out&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class PyGLSL_node_output(bpy.types.ShaderNode, PyGLSLNode):&lt;br /&gt;
&lt;br /&gt;
    bl_idname = 'PyGLSL_node_output'&lt;br /&gt;
    bl_label = 'PyGLSL Output'&lt;br /&gt;
    bl_compatibility = {'CYCLES', 'PyGLSL'}&lt;br /&gt;
    bl_category = &amp;quot;Output&amp;quot;&lt;br /&gt;
    bl_class = &amp;quot;OUTPUT&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def gpufunc(self, ins, outs):&lt;br /&gt;
        out = GPULink()&lt;br /&gt;
        GPU_link_stack(self, &amp;quot;node_output_material&amp;quot;, ins, outs, out);&lt;br /&gt;
        return GPU_link_output(out)&lt;br /&gt;
&lt;br /&gt;
    def init(self, context):&lt;br /&gt;
        self.inputs.new(&amp;quot;NodeSocketShader&amp;quot;, &amp;quot;Surface&amp;quot;)&lt;br /&gt;
        self.inputs.new(&amp;quot;NodeSocketShader&amp;quot;, &amp;quot;Volume&amp;quot;)&lt;br /&gt;
        s = self.inputs.new(&amp;quot;NodeSocketFloat&amp;quot;, &amp;quot;Displacement&amp;quot;)&lt;br /&gt;
        s.hide_value = True&lt;br /&gt;
&lt;br /&gt;
def unregister():&lt;br /&gt;
    bpy.utils.unregister_module(__name__)&lt;br /&gt;
&lt;br /&gt;
def register():&lt;br /&gt;
    lib = '''&lt;br /&gt;
        void node_geometry1(&lt;br /&gt;
            vec3 I, vec3 N, mat4 toworld,&lt;br /&gt;
            out vec3 position, out vec3 normal, out vec3 tangent,&lt;br /&gt;
            out vec3 true_normal, out vec3 incoming, out vec3 parametric,&lt;br /&gt;
            out float backfacing, out float pointiness)&lt;br /&gt;
        {&lt;br /&gt;
            position = (toworld * vec4(N, 0.0)).xyz;&lt;br /&gt;
        }&lt;br /&gt;
    '''&lt;br /&gt;
&lt;br /&gt;
    def gpufunc(self, ins, outs):&lt;br /&gt;
        v_pos = GPULink(builtins.GPU_VIEW_POSITION)&lt;br /&gt;
        v_nor = GPULink(builtins.GPU_VIEW_NORMAL)&lt;br /&gt;
        i_vmat = GPULink(builtins.GPU_INVERSE_VIEW_MATRIX)&lt;br /&gt;
&lt;br /&gt;
        return GPU_link_stack(self, &amp;quot;node_geometry1&amp;quot;, ins, outs, v_pos, v_nor, i_vmat)&lt;br /&gt;
&lt;br /&gt;
    bpy.utils.register_module(__name__)&lt;br /&gt;
    add_engine_compatibility(&amp;quot;PyGLSL&amp;quot;, &amp;quot;ShaderNodeNewGeometry&amp;quot;, (gpufunc, lib))&lt;br /&gt;
    add_engine_compatibility(&amp;quot;PyGLSL&amp;quot;, &amp;quot;ShaderNodeOutputMaterial&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>wiki&gt;Dal</name></author>
		
	</entry>
</feed>