如何使用Arnold API实现lambert着色器? (适合初学者)
这是实现常量着色器的示例。 我不知道如何使用Arnold API实现lambert着色器(集成光和样本)。
#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 {}
答案 0 :(得分:0)
循环场景中的灯光。
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;
}