Master RenderMan Procedural Primitive DSO

原文链接:http://www.cnblogs.com/Jedimaster/archive/2009/10/12/1582070.html RenderMan提供了丰富的程序化生成几何体的方法,包括基于外部程序的RIB生成、基于DSO的直接RI接口调用等。我将通过制作一个直接渲染Karakatoa的PRT粒子文件来演示如何制作类似的插件提高制作效率。本文的DSO在VC8 32bit编译器下编译,在RPS 13.5.2以及Aqsis 1.6.0下得到的结果完全相同。下面是一个起步的DSO用来生成3D Sobol序列并显示出来。
Master RenderMan Procedural Primitive DSO
Master RenderMan Procedural Primitive DSOMaster RenderMan Procedural Primitive DSOCode
// PRTRENDER

#ifdef WINDOWS
    #define PRTRENDER extern "C" __declspec( dllexport )
    #pragma comment(lib,"prman.lib")
    #pragma comment(lib,"libgsl.lib")
#else
    #define PRTRENDER extern "C"
#endif

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <time.h>

#include <ri.h>

#include <gsl/gsl_qrng.h>

PRTRENDER 
RtPointer ConvertParameters(RtString ParamStr)
{
    // RtString FilePath = strdup(ParamStr);
    // fprintf(stdout,"PRTRENDER DSO INFO : Import PRT @ [%s]\n",FilePath);
    // return (RtPointer)FilePath;
}

PRTRENDER
RtVoid Subdivide(RtPointer Data, RtFloat Detail)
{
    RtInt N = 1024;
    RtToken VarP = {"P"};
    RtToken VarCWidth = {"constantwidth"};
    
    gsl_qrng* QRNG = gsl_qrng_alloc(gsl_qrng_sobol,3);
    
    RtFloat* P = (RtFloat*)malloc( sizeof(float)*N*3 );
    
    for( int i=0; i<N; ++i )
    {
        double SingleSobol[3];
        gsl_qrng_get(QRNG,SingleSobol);
        
        int j = i*3;
        P[j+0] = SingleSobol[0] * 2.0 - 1.0;
        P[j+1] = SingleSobol[1] * 2.0 - 1.0;
        P[j+2] = SingleSobol[2] * 2.0 - 1.0;
    }
    
    RtFloat CWidth = 0.01f;
    RtToken DataVar[2] = {VarP,VarCWidth};
    RtPointer DataPointers[2] = {P,&CWidth};
        
    RiPointsV(N,2,DataVar,DataPointers);
    
    free(P);
    gsl_qrng_free(QRNG);
}

PRTRENDER
RtVoid Free(RtPointer Data)
{
    // free(Data);
}

这是在Maya中建模的粒子模型,导出为PRT格式的文件,而后使用DSO读取后直接渲染之。

Master RenderMan Procedural Primitive DSO
Master RenderMan Procedural Primitive DSO
RenderMan supports to generate procedural primitives dynamically, based on both external stdin/stdout execute or DSO. The first is less efficient because the render has to parse the RIB into RI calls again. I will show you how to use this feature to render Karakatoa particles from an PRT file in RenderMan-like render. This DSO has been tested in RPS 13.5 and Aqsis 1.6. Let's begin from an tiny DSO which generate 3D Sobol quasi-random sequence. We made the particles in Maya, exported it as PRT file, and then rendered it by DSO directly.

转载于:https://www.cnblogs.com/Jedimaster/archive/2009/10/12/1582070.html

上一篇:使用tengine DSO 来动态编译安装第三方模块(Lua


下一篇:i2c之汇编和C程序