文章目录[隐藏]
我写博客吧,好像就正经不起来。总会夹杂点杂七杂八的东西。
先说正题吧。
所谓程序员三大浪漫嘛,编译原理,图形学,操作系统(不是我说的,逃
这次说的是图形学。
我好想有个坏毛病,发现个什么好玩的,自己其实根本不懂就喜欢拽着人乱说。
最过分的一次是表彰大会上大礼堂给全学院人讲信息安全(当时到底怎么想的简直不要脸
所以还是继续不要脸一次。
如果现在有人问我,怎样开始喜欢上编程,写点什么项目可以获得最大的成就感。答案肯定是写光线追踪。
唉,自己过去对图像以及显卡的了解真是太 Naive 了……简直等于什么都没有啊。
先上文
用 JavaScript 玩转计算机图形学(一)光线追踪入门
光线追踪的js实现,总共500行代码不到,循序渐进。
最神奇的地方在于,超简单的原理带来了超乎想象的效果。
如果有一点 3D 软件的使用经验和游戏开发经验的话,原理非常直白(当然还要懂点数学和物理,我这种渣水平就够)
但是效果实在是,出人意料。光看图感觉不到,自己敲完代码跑出来,太神奇了(或者是我太无知了 = =)
上图,为了帮助理解,自己改了 3x SSAA ,抗锯齿效果杠杠。
(下图分别是 1x,2x,3x, 反射都是3次追踪。为什么没有 4x ?因为 4x 跑了5分钟然后浏览器跪了……)
附上改的渣代码,确实就是 super-simpling 而已。
function rayTraceReflection(scene, camera, maxReflect) { scene.initialize(); camera.initialize(); var ssaa = 1; //抗锯齿等级 var rawPixels = new Array(); for (var i = 0; i < h * ssaa; i++) { rawPixels[i] = new Array(); } for (var y = 0; y < h * ssaa; y++) { var sy = 1 - y / (h * ssaa); for (var x = 0; x < w * ssaa; x++) { var sx = x / (w * ssaa); var ray = camera.generateRay(sx, sy); rawPixels[y][x] = rayTraceRecursive(scene, ray, maxReflect); } } var i = 0; for (var y = 0; y < h * ssaa; y += ssaa) { for (var x = 0; x < w * ssaa; x += ssaa) { var color = Color.black; for (var yi = 0; yi < ssaa; yi++) { for (var xi = 0; xi < ssaa; xi++) { color = color.add(rawPixels[y + yi][x + xi]) }; }; pixels[i++] = color.r / (ssaa * ssaa) * 255; pixels[i++] = color.g / (ssaa * ssaa) * 255; pixels[i++] = color.b / (ssaa * ssaa) * 255; pixels[i++] = 255; } } ctx.putImageData(imgdata, 0, 0); }
接下来是希望实现正交相机,融合光线,用其他语言(比如C井)实现玩玩这样……
期待什么年代游戏可以 real-time ray tracing ,那会是怎样一番光景啊……(看看现在 tone tracing 的效果都已经如此惊艳了)
说到游戏,不得不提下一个话题。
Ori And The Blind Forest
这个游戏跟 ray tracing 没什么关系,这是一个2D游戏。
与其说游戏,不如说是艺术。第一眼看上去以为是个设计作品,类似可交互动画这样。
结果分分钟打脸,手残党被虐哭……
分分钟成为自己最喜欢的游戏。
和我一起呐喊,软人希!
(Steam平台有售,强烈推荐体验。这个主题只说了这么几句不是没话说,恰是因为实在有太多话说了)
这就是本周的Sean Talk,我们下周见!(设么鬼……什么时候有这个系列了,不要说得好像要开每周专栏了一样好吧><)
完了,书单又多了一本,PBRT……