如何使用Arnold API实现lambert着色器? (对于初学者)

时间:2016-01-27 12:14:09

标签: c++ shader writing

如何使用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 {}

1 个答案:

答案 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;
}

来源:Understanding GI with a basic shader