05 2012 档案

摘要:上一篇文章我们已经可以求出由SH基函数组成特定复合函数的因子,现在我们就来实现三维空间的SHL,光源来自HDR图像。 该算法使用上一篇文章的SH因子计算过程、HDR图像导入过程,同时也使用了光线/物体相交过程。 这里新引进几个结构体。 SHRay-使用两个SHVector3d表示射线的起点和方向。 SHRGBColor-表示RGB颜色值,每个分量都是double精度的浮点数。 SHCoe... 阅读全文
posted @ 2012-05-31 22:51 Cavia 阅读(932) 评论(1) 推荐(1)
摘要:1、二维空间的勒让德多项式勒让德多项式定义在[-1,1]范围内,其递归式是下面这个函数的参数是给定的x,给定的l和m,其中l必须是正整数,而且m在[-l,l]范围内。//勒让德多项式计算方法double ALPStd(float x,int l,int m){ if(l==m) //doubleFactorial(x)计算x!! return (pow(-1,m)*doubleFactorial(2*m-1)*pow(sqrt(l-x*x),m)); if(l==m+1) return (x*(2*m+1)*ALPStd(x,m,m)); ... 阅读全文
posted @ 2012-05-31 16:52 Cavia 阅读(1292) 评论(1) 推荐(0)
摘要:输入:字符串A,B输出:B是否为A的子串算法:设A的长度为n,B的长度为m,即A=A[1…n],B=b[1…m]。假设有两个索引:i,j,并且满足A[i-j+1…i]=B[1…j]相等,也就是说以i结尾的长度为j的A中子串匹配以j结尾的长度为j的B中子串。初始时i=j=0。现在要判断A[i+1]是否和B[j+1]是否相等,如果相等,则i和j都增加1,并且当j等于m时说明B是A的子串;如果不相等,则要重新规划j的值,变成j’,使得A[i-j'+1…i]=B[1…j'],那么怎么确定j’的值呢?要想满足A[i-j'+1…i]=B[1…j'],且已知条件A[i-j+1 阅读全文
posted @ 2012-05-30 15:20 Cavia 阅读(371) 评论(0) 推荐(0)
摘要:1、背景知识1.1 光照表示之前我们都只考虑光源点和物体表面点的光照作用,而现在,我们考虑物体表面点延伸的微型平面,这个微型平面作为半球形的底部,因此光照射进来的范围就是整个半球形,这也是BRDF的基础。1.2 数据压缩对于压缩信号来说,很多压缩技术基于这样一个思路:使用不同基函数的不同组合来组成一个更为复杂的数字信号表示。保存数字信号的最繁琐方法是保存每一个数据点,然而一个复杂的信号可能有成千上万个点,所以需要找到方法来压缩。对于每一个基函数,我们用频率(frequency),振幅(amplitude)和相位(phase)来表示,这三个数被称为系数(coefficient),这样就大大减小了 阅读全文
posted @ 2012-05-29 16:21 Cavia 阅读(1908) 评论(0) 推荐(0)
摘要:Phong模型让物体看起来具有塑料感,需要其他模型来得到更精确的金属和高光材质。高光的颜色取决于材质类型,比如白色适合塑料,金属类导体的高光颜色最好是和材质颜色一样。1、Ward反射模型有各向同性和各向异性两种形式。两种形式下的漫反射分量都是常数。下面是各向同性的形式。sigma是材质的粗糙度(常数)效果:roughness=0.25下面是各向异性的形式。sigma是材质的粗糙度(表面两个垂直方向上的各不相同)效果:roughX=0.9,rough=0.12、Schlick反射模型该模型的效果和Phong模型相似,但是由于去掉了指数项,使得其计算速度更快。效果n=73、Cook-Torranc 阅读全文
posted @ 2012-05-28 18:40 Cavia 阅读(2763) 评论(0) 推荐(0)
摘要:Lambertian漫反射模型假设反射光均匀分布在所有方向,简单方便。1、Oren-Nayar漫反射一些粗糙的表面具有很大程度逆反射的性质(反射向量和入射光线在发现的同一边)。sigma是表面的粗糙度该算法在光照向量和观察向量比较接近时最有效。效果:roughness=sqrt(0.5);2、Minnaert漫反射特别适合天鹅绒外观的建模。效果:m=0.8 阅读全文
posted @ 2012-05-28 15:24 Cavia 阅读(1788) 评论(0) 推荐(0)
摘要: 阅读全文
posted @ 2012-05-28 14:55 Cavia 阅读(1047) 评论(0) 推荐(0)
摘要:1. Irradiance(辐照度) total amount of energy received per unit area of a surface 2. Illuminance(照明度) essentially same as irradiance,the difference is that illuminance measures the amount of visible... 阅读全文
posted @ 2012-05-28 14:38 Cavia 阅读(1993) 评论(0) 推荐(0)
摘要:1、随机采样 在基本光线追踪算法中,只追踪有限数目的光线。这是一个采样过程(sampling process)。 采样有很多种方法: a、均匀采样 举例:根据给定的区间绘制数学函数。 将区间划分为许多小的宽度一致的小区间,在小区间的中点处计算函数的值,最终将这些点平滑连接出来。 在小区间数目很少的情况下,均匀采样可能会得到错误的结果。 b、随机采样 使用随机间隔宽度代替统一间隔... 阅读全文
posted @ 2012-05-28 09:26 Cavia 阅读(1500) 评论(0) 推荐(0)
摘要:该伪代码总结了光线追踪算法。 Function Raytrace(Scene World){ for(each pixel of the image) { Calculate the ray corresponding to the pixel (projection); Pixel color=trace(ray,0); ... 阅读全文
posted @ 2012-05-27 23:13 Cavia 阅读(2039) 评论(0) 推荐(0)
摘要:问题:1、性能算法的递归性质和大数目的追踪光线,渲染过程可能持续数小时。80-90%的渲染时间花费在计算光线和物体交点上。2、走样3、尖锐的阴影基本的光线追踪算法只能得到尖锐的阴影(因为模拟的是点光源)。4、局部光照和着色算法只追踪少数目的光线,只有四种类型的光线被考虑在内,物体之间的漫反射光没有被考虑在内,即算法并不包括全局光照。解决方案:1、性能a、使用更多或者更好的硬件b、大规模并行计算每一个光线都相互独立。将图像分割,分配在多核上或者分布式网络上;或者分配在多个线程上。c、限制交点检测的数目使用包围盒的层次关系。快速判断光线是否和一组物体相交。物体被分组在封闭的包围盒中。利用空间细分技 阅读全文
posted @ 2012-05-27 16:50 Cavia 阅读(5441) 评论(0) 推荐(0)
摘要:1、主光线(Primary rays)从camera发出的光线。2、阴影光线(Shadow/Light rays)从交点发出的光线,指向光源。如果这条光线在指向光源之前不相交于任何物体,则这个光源对该交点有贡献值;否则,该交点位于该光源的阴影处。3、反射光线(Reflection rays)如果物体表面具有反射性质,则部分光将会被反射出去,继续在场景中前进。根据Snell定律,一条新的光线将会从交点发出。4、折射光线(Refracted rays)当物体表面具有折射性质并且部分透明,部分光线将会进入物体继续传播。根据Snell定律,一条新的光线将会从交点发出进入物体。 阅读全文
posted @ 2012-05-27 15:40 Cavia 阅读(3039) 评论(0) 推荐(0)
摘要:实际上叫反向光线追踪(backward raytracing),因为计算是从camera开始发射光线,而不是从光源发射光线。反向光线追踪步骤:1、camera的胶片被分成离散的网格(即像素点),我们的目标是确定每一个像素点的颜色值。2、对于每一个像素,从camera位置追踪一条光线,指向该像素点3、对于这束光线,判断其是否和场景中的物体相交。如果相交,则转到步骤4;否则,将背景色填充到当前像素中去,回到步骤2,继续处理下一个像素。4、如果光线和物体相交,计算物体表面交点的颜色值。该点的颜色值即为该像素的颜色值。a、首先检查每个光源在该交点的贡献值。追踪一条新光线去光源,用来确定交点是被全部照亮 阅读全文
posted @ 2012-05-27 15:16 Cavia 阅读(18361) 评论(0) 推荐(1)
摘要:View Code 1 /* 2 题目:求1+2+…+n, 3 要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。 4 */ 5 6 7 class Calculation 8 { 9 public:10 Calculation()11 {12 ++n;13 sum+=n;14 }15 static void Reset()16 {17 n=0;18 sum=0;19 }20 static int GetS... 阅读全文
posted @ 2012-05-16 15:37 Cavia 阅读(378) 评论(0) 推荐(0)
摘要:View Code 1 #include <iostream> 2 using namespace std; 3 4 const int SIZE=10; 5 6 int getFrequency(int index,int* bottom) 7 { 8 int count=0; 9 for(int i=0;i<SIZE;++i)10 {11 if(bottom[i]==index)12 count++;13 }14 return count;15 }16 17 void Calc(const int* Up... 阅读全文
posted @ 2012-05-15 16:19 Cavia 阅读(271) 评论(0) 推荐(0)
摘要:View Code 1 //计算达到相同字符串的操作个数 2 int SimuDegree(char* a,char* b) 3 { 4 int lenA=strlen(a); 5 int lenB=strlen(b); 6 if(lenA==0 || lenB==0) 7 return abs(lenA-lenB); 8 if((*a)==(*b)) 9 return SimuDegree(a+1,b+1);10 else11 {12 13 return min(min(Simu... 阅读全文
posted @ 2012-05-07 15:40 Cavia 阅读(266) 评论(1) 推荐(0)
摘要:一、排序1、应用a、一些程序需要有序的输出,二分查找之类的程序需要一个有序的输入。b、收集相同项:使用排序来收集序列中相同的项,后缀数组收集相同的单词。2、算法a、插入排序:O(n^2)的最坏时间,如果给一个大致有序的数组进行排序,则只需要O(n)时间,是稳定的。b、快速排序:最优时间O(nlogn),最坏情况O(n^2)时间O(n)空间c、堆排序:任何情况都是O(nlogn)时间d、其他:归并排序,选择排序,希尔排序e、基数排序f、位图排序:序列中的整数在一个范围内,没有重复的数,没有额外的数据。二、查找1、算法a、线性查找b、二分查找:有序数组c、哈希d、二叉查找树e、关键字索引:bins 阅读全文
posted @ 2012-05-05 13:03 Cavia 阅读(434) 评论(0) 推荐(0)
摘要:首先是letter-level的马尔科夫链然后是word-level的马尔科夫链word-level 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 //输入的字符串 6 char inputchars[4300000]; 7 #define MAXWORDS 80000 8 //字符串中没一个单词 9 char *word[MAXWORDS]; 10 //单词个数 11 int nword=0; 12 //k-order 13 int k=2; 14 15 //has 阅读全文
posted @ 2012-05-05 10:20 Cavia 阅读(591) 评论(0) 推荐(0)
摘要:input:m,n and m<noutput:a sorted list of m random integers in the range 0...n-1View Code 1 void genknuth(int m,int n) 2 { 3 for(int i=0;i<n;++i) 4 { 5 if((bigrand()%(n-i))<m) 6 { 7 cout <<i<<endl; 8 --m; 9 }10 }11 }12 13 14 void gensets(in... 阅读全文
posted @ 2012-05-03 10:43 Cavia 阅读(233) 评论(0) 推荐(0)