Как реализовать шейдер Ламберта с помощью Arnold API? (для начинающих)

Как реализовать шейдер Ламберта с помощью Arnold API? (для начинающих)

Это пример реализации постоянного шейдера.
Я не знаю, как реализовать шейдер Ламберта, используя Arnold API (интегрировать свет и образцы)

#include <ai.h>
#include <cstring>

AI_SHADER_NODE_EXPORT_METHODS(LambertMethods);

enum LambertParameters {p_albedo};

node_parameters {
AiParameterRGB("albedo", 1.0f, 1.0f, 1.0f);
}

node_loader {
if (i > 0) return false;
node->methods = LambertMethods;
node->output_type = AI_TYPE_RGB;
node->name = "Lambert";
node->node_type = AI_NODE_SHADER;
strcpy(node->version, AI_VERSION);
return true;
}

node_initialize {}

node_update {}

shader_evaluate {
AtColor albedo = AiShaderEvalParamRGB(p_albedo);
sg->out.RGB = albedo;
}

node_finish {}

1

Решение

Зацикливание света на сцене.

shader_evaluate {
AtColor albedo = AiShaderEvalParamRGB(p_albedo);
AtColor diffuse = AI_RGB_BLACK;
AiLightsPrepare(sg);
while (AiLightsGetSample(sg)) {
if (AiLightGetAffectDiffuse(sg->Lp)) {
float LdotN = AiV3Dot(sg->Ld, sg->N)
diffuse += albedo * sg->Li * sg->we * AI_ONEOVERPI * max(0, LdotN);
}
}
sg->out.RGB = diffuse;
}

Источник: Понимание GI с базовым шейдером

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]