Trying to replicate/create Half-Lambert shader

As the title says, I’m trying to create this shading model for a material. In essence, it allows the otherwise dark areas to be lighter as the effect of light is spread more over the entire surface. This is particularly useful for toon shaders which because of their gradients could use some extra light.

This is the math, which it appears I can do with Blender’s nodes.

To soften the diffuse contribution from local lights, the dot product from the [Lambertian model] is scaled by ½, add ½ and squared. The result is that this dot product, which normally lies in the range of -1 to +1, is instead in the range of 0 to 1 and has a more pleasing falloff.

I’ve done as much in Blender, but how and where should I hook this up?

This is part of a larger shader, in which I’ve done very well replicating all the aspects of what I’m copying, a shader from a game engine.

Somebody coded a half-lambert shader but it no longer works with the later versions of Eevee and the node shows up as undefined. I don’t know if I can fix that or salvage what the node contains to share.

Ah, here is the half-lambert custom written shader. The problem is that I don’t how how to use this code or how to modify it to work with the latest version of Blender. It’s only 66 lines. Can someone help me?

/*
 * ***** BEGIN GPL LICENSE BLOCK *****
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 * The Original Code is Copyright (C) 2005 Blender Foundation.
 * All rights reserved.
 *
 * The Original Code is: all of this file.
 *
 * Contributor(s): Kanzaki Wataru
 *
 * ***** END GPL LICENSE BLOCK *****
 */

#include "../node_shader_util.h"

/* **************** OUTPUT ******************** */

static bNodeSocketTemplate sh_node_bsdf_smooth_in[] = {
	{	SOCK_RGBA, 1, N_("Color"),		0.8f, 0.8f, 0.8f, 1.0f, 0.0f, 1.0f},
	{	SOCK_FLOAT, 1, N_("Contrast"),	2.0f, 0.0f, 0.0f, 0.0f, 1.0f, 10.0f, PROP_FACTOR},
	{	SOCK_VECTOR, 1, N_("Normal"),	0.0f, 0.0f, 0.0f, 1.0f, -1.0f, 1.0f, PROP_NONE, SOCK_HIDE_VALUE},
	{	-1, 0, ""	}
};

static bNodeSocketTemplate sh_node_bsdf_smooth_out[] = {
	{	SOCK_SHADER, 0, N_("BSDF")},
	{	-1, 0, ""	}
};

static int node_shader_gpu_bsdf_smooth(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(execdata), GPUNodeStack *in, GPUNodeStack *out)
{
	if (!in[2].link)
		GPU_link(mat, "world_normals_get", &in[2].link);

	return GPU_stack_link(mat, node, "node_bsdf_smooth", in, out);
}

/* node type definition */
void register_node_type_sh_bsdf_smooth(void)
{
	static bNodeType ntype;

	sh_node_type_base(&ntype, SH_NODE_BSDF_SMOOTH, "Smooth Diffuse BSDF", NODE_CLASS_SHADER, 0);
	node_type_compatibility(&ntype, NODE_NEW_SHADING);
	node_type_socket_templates(&ntype, sh_node_bsdf_smooth_in, sh_node_bsdf_smooth_out);
	node_type_size_preset(&ntype, NODE_SIZE_MIDDLE);
	node_type_init(&ntype, NULL);
	node_type_storage(&ntype, "", NULL, NULL);
	node_type_gpu(&ntype, node_shader_gpu_bsdf_smooth);

	nodeRegisterType(&ntype);
}

Taken from here…
https://developer.blender.org/D3205?id=10536#change-PkQtbPKdt8C9

I realize this is very late, but I’ve been working on a Toon shader that converts well between Blender and Unity that uses the half-lambert lighting model.

I believe this is how to effectively achieve half-lambert lighting in Blender -
HalfLambertInBlender

1 Like