Как реализовать шейдер Ламберта с помощью 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 {}
Зацикливание света на сцене.
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 с базовым шейдером
Других решений пока нет …