ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Master RenderMan Procedural Primitive DSO

2019-08-13 22:07:25  阅读:323  来源: 互联网

标签:Primitive qrng PRT PRTRENDER DSO Master include RtPointer


原文链接: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序列并显示出来。

ContractedBlock.gifExpandedBlockStart.gifCode
// 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读取后直接渲染之。



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

标签:Primitive,qrng,PRT,PRTRENDER,DSO,Master,include,RtPointer
来源: https://blog.csdn.net/weixin_30650859/article/details/99481035

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有