我尝试在着色器的node_initialize
和node_update
函数中定义着色器的数据,但由于检索函数的原因,它无法编译:
intValue = AiGetNodeInt(node,"parameter"); // error
字符串
是否有其他方法来存储和检索着色器的数据属性?我在node_update
函数上遇到了问题。这不管用
#include "X3VU.h"
AI_SHADER_NODE_EXPORT_METHODS(X3VUMethods);
namespace {
enum X3VUParams { p_wiMatrix, p_baseColor, p_textureColor, p_textureMask, p_renderOption, p_tileU, p_tileV, p_seed, p_randomness };
const char* optionList[] = {"Normal","Position","TextureUV","TextureUVW","TextureUVW2",NULL};
};
node_parameters
{
AiParameterMtx("wiMatrix", AI_M4_IDENTITY);
AiParameterRGB("BaseColor", 0.7f, 0.7f, 0.7f);
AiParameterRGB("TextureColor", 0.7f, 0.7f, 0.7f);
AiParameterFlt("TextureMask", 1.0f);
AiParameterEnum("RenderOption", 3, optionList);
AiParameterInt("TileU", 10);
AiParameterInt("TileV", 10);
AiParameterInt("Seed", 1);
AiParameterFlt("Randomness", 1.0f);
}
struct X3VUtile {
int nU; // number of tiles in U
int nV; // number of tiles in V
int * randList; // nU*nV random list
int seed; // random seed [0,inf]
float randomness; // randomness in range [0,1]
};
node_initialize{
X3VUtile* tile = (X3VUtile*)AiMalloc(sizeof(X3VUtile));
AiNodeSetLocalData(node, tile);
}
node_update{
X3VUtile *tile = (X3VUtile*)AiNodeGetLocalData(node);
tile->nU = AiNodeGetInt(node, "TileU");
printf("node update: tileU: %d, tileV: %d \n", tile->nU, tile->nV);
}
node_finish{
AiFree(AiNodeGetLocalData(node));
}
shader_evaluate
{
AtMatrix *wimatrix = AiShaderEvalParamMtx(p_wiMatrix); // world inverse matrix
AtVector wpoint = sg->P; // world point
wpoint = AiM4PointByMatrixMult( *wimatrix, wpoint); // world point by inverse matrix
AtVector wnormal = sg->N; // world normal
wnormal = AiM4VectorByMatrixMult( *wimatrix, wnormal); // world normal by inverse matrix
wnormal = AiV3Normalize( wnormal ); // normalize world normal
int renderOption = AiShaderEvalParamEnum( p_renderOption );
switch (renderOption) {
default:
sg->out.RGB() = AiShaderEvalParamRGB(p_baseColor);
break;
case 0:
sg->out.RGB() = { fabs(wnormal.x), fabs(wnormal.y), fabs(wnormal.z) };
break;
case 1:
X3vector_toFloorMod( &wpoint, &wpoint);
sg->out.RGB() = { fabs(wpoint.x), fabs(wpoint.y), fabs(wpoint.z) };
break;
case 2:
sg->out.RGB() = AiShaderEvalParamRGB(p_textureColor);
break;
case 3:
break;
case 4:
break;
}// end switch
}
node_loader
{
if (i > 0)
return false;
node->methods = X3VUMethods;
node->output_type = AI_TYPE_RGB;
node->name = "X3VU";
node->node_type = AI_NODE_SHADER;
strcpy_s(node->version, AI_VERSION);
return true;
}
型
1条答案
按热度按时间plicqrtu1#
有人给了我答案:你必须使用AtString作为char* 参数。
字符串