win平台运行smallpt

news/2025/1/5 17:50:53/文章来源:https://www.cnblogs.com/qbning/p/18644540

smallpt: Global Illumination in 99 lines of C++

首先在win平台需要添加函数erand48,修改为main函数,其中的samps是每个像素的采样率,越大越慢

修改后
#include <math.h>   // smallpt, a Path Tracer by Kevin Beason, 2008
#include <stdlib.h> // Make : g++ -O3 -fopenmp smallpt4k.cpp -o smallpt4k
#include <stdio.h>  //        Remove "-fopenmp" for g++ version < 4.2
struct Vec {        // Usage: time ./smallpt4k && xv image.ppmdouble x, y, z;                  // position, also color (r,g,b)Vec(double x_=0, double y_=0, double z_=0){ x=x_; y=y_; z=z_; }Vec operator+(const Vec &b) const { return Vec(x+b.x,y+b.y,z+b.z); }Vec operator-(const Vec &b) const { return Vec(x-b.x,y-b.y,z-b.z); }Vec operator*(double b) const { return Vec(x*b,y*b,z*b); }Vec mult(const Vec &b) const { return Vec(x*b.x,y*b.y,z*b.z); }Vec& norm(){ return *this = *this * (1/sqrt(x*x+y*y+z*z)); }double dot(const Vec &b) const { return x*b.x+y*b.y+z*b.z; } // cross:Vec operator%(Vec&b){return Vec(y*b.z-z*b.y,z*b.x-x*b.z,x*b.y-y*b.x);}
};
struct Ray { Vec o, d; Ray(Vec o_, Vec d_) : o(o_), d(d_) {} };
enum Refl_t { DIFF, SPEC, REFR };  // material types, used in radiance()
struct Sphere {double rad;       // radiusVec p, e, c;      // position, emission, colorRefl_t refl;      // reflection type (DIFFuse, SPECular, REFRactive)Sphere(){}Sphere(double rad_, Vec p_, Vec e_, Vec c_, Refl_t refl_):rad(rad_), p(p_), e(e_), c(c_), refl(refl_) {}double intersect(const Ray &r) const { // returns distance, 0 if nohitVec op = p-r.o; // Solve t^2*d.d + 2*t*(o-p).d + (o-p).(o-p)-R^2 = 0double t, eps=1e-4, b=op.dot(r.d), det=b*b-op.dot(op)+rad*rad;if (det<0) return 0; else det=sqrt(det);return (t=b-det)>eps ? t : ((t=b+det)>eps ? t : 0);}
};
Sphere spheres[9]; //Scene: radius, position, emission, color, material
inline double clamp(double x){ return x<0 ? 0 : x>1 ? 1 : x; }
inline int toInt(double x){ return int(pow(clamp(x),1/2.2)*255+.5); }
inline bool intersect(const Ray &r, double &t, int &id){double n=sizeof(spheres)/sizeof(Sphere), d, inf=t=1e20;for(int i=int(n);i--;) if((d=spheres[i].intersect(r))&&d<t){t=d;id=i;}return t<inf;
}
inline double erand48(unsigned short xsubi[3]) {return (double)rand() / (double)RAND_MAX;
}
Vec radiance(const Ray &r, int depth, unsigned short *Xi){double t;                               // distance to intersectionint id=0;                               // id of intersected objectif (!intersect(r, t, id)) return Vec(); // if miss, return blackconst Sphere &obj = spheres[id];        // the hit objectVec x=r.o+r.d*t, n=(x-obj.p).norm(), nl=n.dot(r.d)<0?n:n*-1, f=obj.c;double p = f.x>f.y && f.x>f.z ? f.x : f.y>f.z ? f.y : f.z; // max reflif (++depth>5) if (erand48(Xi)<p) f=f*(1/p); else return obj.e; //R.R.if (obj.refl == DIFF){                  // Ideal DIFFUSE reflectiondouble r1=2*M_PI*erand48(Xi), r2=erand48(Xi), r2s=sqrt(r2);Vec w=nl, u=((fabs(w.x)>.1?Vec(0,1):Vec(1))%w).norm(), v=w%u;Vec d = (u*cos(r1)*r2s + v*sin(r1)*r2s + w*sqrt(1-r2)).norm();return obj.e + f.mult(radiance(Ray(x,d),depth,Xi));} else if (obj.refl == SPEC)            // Ideal SPECULAR reflectionreturn obj.e + f.mult(radiance(Ray(x,r.d-n*2*n.dot(r.d)),depth,Xi));Ray reflRay(x, r.d-n*2*n.dot(r.d));     // Ideal dielectric REFRACTIONbool into = n.dot(nl)>0;                // Ray from outside going in?double nc=1, nt=1.5, nnt=into?nc/nt:nt/nc, ddn=r.d.dot(nl), cos2t;if ((cos2t=1-nnt*nnt*(1-ddn*ddn))<0)    // Total internal reflectionreturn obj.e + f.mult(radiance(reflRay,depth,Xi));Vec tdir = (r.d*nnt - n*((into?1:-1)*(ddn*nnt+sqrt(cos2t)))).norm();double a=nt-nc, b=nt+nc, R0=a*a/(b*b), c = 1-(into?-ddn:tdir.dot(n));double Re=R0+(1-R0)*c*c*c*c*c,Tr=1-Re,P=.25+.5*Re,RP=Re/P,TP=Tr/(1-P);return obj.e + f.mult(depth>2 ? (erand48(Xi)<P ?   // Russian rouletteradiance(reflRay,depth,Xi)*RP:radiance(Ray(x,tdir),depth,Xi)*TP) :radiance(reflRay,depth,Xi)*Re+radiance(Ray(x,tdir),depth,Xi)*Tr);
}
int main() {
spheres[0]=Sphere(1e5, Vec( 1e5+1,40.8,81.6), Vec(),Vec(.75,.25,.25),DIFF);//Left
spheres[1]=Sphere(1e5, Vec(-1e5+99,40.8,81.6),Vec(),Vec(.25,.25,.75),DIFF);//Rght
spheres[2]=Sphere(1e5, Vec(50,40.8, 1e5),     Vec(),Vec(.75,.75,.75),DIFF);//Back
spheres[3]=Sphere(1e5, Vec(50,40.8,-1e5+170), Vec(),Vec(),           DIFF);//Frnt
spheres[4]=Sphere(1e5, Vec(50, 1e5, 81.6),    Vec(),Vec(.75,.75,.75),DIFF);//Botm
spheres[5]=Sphere(1e5, Vec(50,-1e5+81.6,81.6),Vec(),Vec(.75,.75,.75),DIFF);//Top
spheres[6]=Sphere(16.5,Vec(27,16.5,47),       Vec(),Vec(1,1,1)*.999, SPEC);//Mirr
spheres[7]=Sphere(16.5,Vec(73,16.5,78),       Vec(),Vec(1,1,1)*.999, REFR);//Glas
spheres[8]=Sphere(600, Vec(50,681.6-.27,81.6),Vec(12,12,12),  Vec(), DIFF);//Liteint w=1024, h=768, samps = 5000/4; // # samplesRay cam(Vec(50,52,295.6), Vec(0,-0.042612,-1).norm()); // cam pos, dirVec cx=Vec(w*.5135/h), cy=(cx%cam.d).norm()*.5135, r,*c=(Vec*)malloc(sizeof(Vec)*w*h);
#pragma omp parallel for schedule(dynamic, 1) private(r)       // OpenMPfor (int y=0; y<h; y++){                       // Loop over image rowsfprintf(stderr,"\rRendering (%d spp) %5.2f%%",samps*4,100.*y/(h-1));for (unsigned short x=0, Xi[3]={0,0,y*y*y}; x<w; x++)   // Loop colsfor (int sy=0, i=(h-y-1)*w+x; sy<2; sy++)     // 2x2 subpixel rowsfor (int sx=0; sx<2; sx++, r=Vec()){        // 2x2 subpixel colsfor (int s=0; s<samps; s++){double r1=2*erand48(Xi), dx=r1<1 ? sqrt(r1)-1: 1-sqrt(2-r1);double r2=2*erand48(Xi), dy=r2<1 ? sqrt(r2)-1: 1-sqrt(2-r2);Vec d = cx*( ( (sx+.5 + dx)/2 + x)/w - .5) +cy*( ( (sy+.5 + dy)/2 + y)/h - .5) + cam.d;r = r + radiance(Ray(cam.o+d*140,d.norm()),0,Xi)*(1./samps);} // Camera rays are pushed ^^^^^ forward to start in interiorc[i] = c[i] + Vec(clamp(r.x),clamp(r.y),clamp(r.z))*.25;}}FILE *f = fopen("image.ppm", "w");         // Write image to PPM file.fprintf(f, "P3\n%d %d\n%d\n", w, h, 255);for (int i=0; i<w*h; i++)fprintf(f,"%d %d %d ", toInt(c[i].x), toInt(c[i].y), toInt(c[i].z));fclose(f);exit(0);
}

然后需要安装MSYS2

安装完成后将

C:\msys64\mingw64\bin

添加入环境变量

然后打开MSYS2 MINGW64,在里面创建文件,把代码复制进去

g++ -O3 -fopenmp smallpt.cpp -o smallpt 

编译,

它的home目录一般在

C:\msys64\home

运行编译后的结果

会生成ppm文件PPM Format Specification

可以用GIMP - Downloads打开

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/861989.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对Sentinel的链路分析与客户端服务端交互理解

Sentinel介绍 略 https://sentinelguard.io/zh-cn/ https://github.com/alibaba/Sentinel https://sentinelguard.io/zh-cn/docs/quick-start.html https://github.com/alibaba/Sentinel/wiki/Sentinel-核心类解析 Sentinel定义的术语 Entry: 表示对某个资源的访问请求,通过 S…

手写 k近邻 与 全连接神经网络 算法

KNN(K-近邻算法) K-近邻算法的介绍 参考: https://blog.csdn.net/weixin_39910711/article/details/114440816 手写knn算法,实现mnist的图片数字识别 # 手动 实现knn import io from struct import pack,unpack import random from PIL import Image import time import nump…

jmeter参数化取数机制

场景:参数化文件中只有3个账户 并发数设置的是4 执行一次,如何取值当参数化文件中所有值全部取完后,又会从头开始取值(如图所示,只有三个账户,并发数为4,第1个线程取值和第4个线程取值相同) 如果是一个线程,循环(迭代)4次,取值同上面一致

甲子光年智库发布《中国 AI 算力行业发展报告》

12月30日,甲子光年智库正式发布《中国AI算力行业发展报告》。中昊芯英受邀参与了该报告的编写工作,并为报告的编写贡献了专业的见解和实践经验。12 月 30 日,备受业界关注的《中国 AI 算力行业发展报告》(以下简称「报告」)由甲子光年智库正式发布。该报告为行业内外提供了…

盘点!2024年航空航天大事件

​2024年,航空航天领域再次迎来了丰硕成果。这一年,不仅见证了中国航空航天技术的飞速发展,也目睹了其他国家在航空航天探索中的持续突破。从嫦娥六号完成世界首次月球背面自动采样返回,到SpaceX星舰实现“筷子夹火箭”奇景,航空航天领域呈现出前所未有的活力和创造力。低…

谷歌浏览器json插件

1.下载插件 https://www.baidufe.com/fehelper/index/index.html 2.添加插件 浏览里里打开路径:chrome://extensions/3.将下载好的插件托拽到浏览器里即可 4.效果

lovelymem梭哈solar内存取证---Alex4nd3r

内存取证1 请找到rdp连接的跳板地址flag{192.168.60.220}内存取证2 请找到攻击者下载黑客工具的IP地址控制台信息flag{155.94.204.67}内存取证3 攻击者获取的“FusionManager节点操作系统帐户(业务帐户)”的密码是什么flag{GalaxManager_2012}内存取证4 请找到攻击者创建的用…

hot100-一刷-13堆(共3道题)

215. 数组中的第K个最大元素 题目链接 题目描述代码实现 分析:后面可以看下官方题解的,手动写排序或者大顶堆。代码: class Solution {public int findKthLargest(int[] nums, int k) {PriorityQueue<Integer> pq = new PriorityQueue<>((n1, n2) -> n1 - n2…

hot100-一刷-14贪心(共4道题)

121. 买卖股票的最佳时机 题目链接 题目描述代码实现 分析: 我们需要知道第 i 天之前,股票价格的最小值是什么,再讨论从股票最小值买入,第i天卖出获得的利润,取最大值。 代码: class Solution {public int maxProfit(int[] prices) {int minPrice = prices[0];int ans = …

中考英语优秀范文-004 Who is your favourite movie star? 你最喜欢的电影明星是谁?

中考英语优秀范文-004 Who is your favourite movie star? 你最喜欢的电影明星是谁? 1 写作要求 请根据以下提示信息以My favourite movie star为题,用英语写一篇80词左右的短文,可适当发挥。 提示信息: Who is your favourite movie star? What does he or she look lik…

静力学FEM12.31

1.静力学方程 考虑图所示变截面弹性杆的静态响应。这是线性应力分析或线弹性问题的一个例子,我们需要求杆内的应力分布σ(x)。 应力由物体的变形产生,而变形由物体内各点的位移u(x)表征。位移导致用ε(x)表示的应变;应变是一个无量纲变量。杆受到分布力b(x)或集中力作用。这…