阅读更多

0顶
0踩

行业应用

原文:VoxelSpace
作者:Sebastian Macke
翻译:Vincent

Voxel Space


体素空间引擎的Web Demo

 

追溯历史

让我们把时间拨回到1992年。当时的CPU处理速度比现在的要慢1000倍,通过GPU加速当时还未问世,而且CPU也是无法承受的。3D游戏仅在CPU上进行计算,渲染引擎使用单一颜色对多边形进行渲染填充。


MicroProse于1991年发布的游戏Gunship 2000

同年NovaLogic也发布了游戏科曼奇


NovaLogic于1992年发布的游戏Comanche

在我看来,当时这种图形出来以后简直叹为观止,它最起码提前了3年。用户可以看到很多的细节,比如山脉,甚至山谷的纹理,这是第一次有一个比较清晰的阴影。当然,它是像素化的,但那时候所有的游戏都是像素化的。

 

渲染算法

科曼奇使用了一种名为体素空间(Voxel Space)的技术,它和ray casting是基于同一个想法。因此,体素空间引擎是2.5D引擎,它不具有规则的3D引擎提供的所有自由度。

 

高度地图和颜色地图

 

高度地图和颜色图是表示地形最简单的方法。科曼奇使用了1024 * 1024一个字节代表了高度地图,同样使用了1024 * 1024一个字节表示颜色地图,你可以在这个网站上下载。这些地图是周期性:

这样的地图将地形限制为“地图上每个位置一个高度” - 因此像建筑物或树木这样的复杂几何形状不可能表示出来。然而,色彩地图的一大优点是,它已经包含了色彩和阴影。体素空间引擎只需要颜色,在渲染过程中不需要计算光照。

 

基本算法

 

对于3D引擎来说,渲染算法非常简单。体素空间引擎负责渲染高度地图和颜色地图,并绘制垂直线。下图演示了这种技术。

  • 清除屏幕。
  • 为了保证遮挡从后面开始并呈现在前面。这被称为画家算法。
  • 确定地图上的线,它对应于与观察者相同的光距离。考虑视场和透视投影(物体在更远的地方)
  • 光栅线是用来匹配屏幕的列数。
  • 从线段对应的二维地图中检索高度和颜色。
  • 执行高度坐标的透视投影
  • 用透视投影中检索到的高度画一条垂直线。

核心算法以最简单的形式包含了几行代码(python语法):

def Render(p, height, horizon, scale_height, distance, screen_width, screen_height):
    # Draw from back to the front (high z coordinate to low z coordinate)
    for z in range(distance, 1, -1):
        # Find line on map. This calculation corresponds to a field of view of 90°
        pleft  = Point(-z + p.x, -z + p.y)
        pright = Point( z + p.x, -z + p.y)
        # segment the line
        dx = (pright.x - pleft.x) / screen_width
        # Raster line and draw a vertical line for each segment
        for i in range(0, screen_width):
            height_on_screen = (height - heightmap[pleft.x, pleft.y]) / z * scale_height. + horizon
            DrawVerticalLine(i, height_on_screen, screen_height, colormap[pleft.x, pleft.y])
            p1eft.x += dx

# Call the render function with the camera parameters:
# position, height, horizon line position,
# scaling factor for the height, the largest distance, 
# screen width and the screen height parameter
Render( Point(0, 0), 50, 120, 120, 300, 800, 600 )

 

添加旋转

 

按照上面的算法我们只能看到北面。不同的角度需要多行代码来旋转坐标。

def Render(p, phi, height, horizon, scale_height, distance, screen_width, screen_height):
    # precalculate viewing angle parameters
    var sinphi = math.sin(phi);
    var cosphi = math.cos(phi);

    # Draw from back to the front (high z coordinate to low z coordinate)
    for z in range(distance, 1, -1):

        # Find line on map. This calculation corresponds to a field of view of 90°
        pleft = Point(
            (-cosphi*z - sinphi*z) + p.x,
            ( sinphi*z - cosphi*z) + p.y)
        pright = Point(
            ( cosphi*z - sinphi*z) + p.x,
            (-sinphi*z - cosphi*z) + p.y)

        # segment the line
        dx = (pright.x - pleft.x) / screen_width
        dy = (pright.y - pleft.y) / screen_width

        # Raster line and draw a vertical line for each segment
        for i in range(0, screen_width):
            height_on_screen = (height - heightmap[pleft.x, pleft.y]) / z * scale_height. + horizon
            DrawVerticalLine(i, height_on_screen, screen_height, colormap[pleft.x, pleft.y])
            p1eft.x += dx
            p1eft.y += dy

# Call the render function with the camera parameters:
# position, viewing angle, height, horizon line position, 
# scaling factor for the height, the largest distance, 
# screen width and the screen height parameter
Render( Point(0, 0), 0, 50, 120, 120, 300, 800, 600 )

 

更多的性能说明

 

当然,要想达到更高的性能,还有很多小技巧可以使用。

  • 与从后面到前面绘制相比,从前面到后面进行绘制会更好。优点之一就是我们不必每次都因为遮挡而需要在屏幕的底部画线。但是,为了保证遮挡,我们需要一个额外的Y缓冲区。对于每一列来说,相当于y的最高位置已经存储了。因为我们是按照从前面到后面这个顺序进行绘制的,那么下一行的可见部分只能大于先前绘制的最高行。
  • 详细的渲染程度。前面的细节渲染多一点,远处的细节渲染的少一点。

def Render(p, phi, height, horizon, scale_height, distance, screen_width, screen_height):
    # precalculate viewing angle parameters
    var sinphi = math.sin(phi);
    var cosphi = math.cos(phi);

    # initialize visibility array. Y position for each column on screen 
    ybuffer = np.zeros(screen_width)
    for i in range(0, screen_width):
        ybuffer[i] = screen_height

    # Draw from front to the back (low z coordinate to high z coordinate)
    dz = 1.
    z = 1.
    while z < distance
        # Find line on map. This calculation corresponds to a field of view of 90°
        pleft = Point(
            (-cosphi*z - sinphi*z) + p.x,
            ( sinphi*z - cosphi*z) + p.y)
        pright = Point(
            ( cosphi*z - sinphi*z) + p.x,
            (-sinphi*z - cosphi*z) + p.y)

        # segment the line
        dx = (pright.x - pleft.x) / screen_width
        dy = (pright.y - pleft.y) / screen_width

        # Raster line and draw a vertical line for each segment
        for i in range(0, screen_width):
            height_on_screen = (height - heightmap[pleft.x, pleft.y]) / z * scale_height. + horizon
            DrawVerticalLine(i, height_on_screen, ybuffer[i], colormap[pleft.x, pleft.y])
            if height_on_screen < ybuffer[i]:
                ybuffer[i] = heightonscreen
            p1eft.x += dx
            p1eft.y += dy

        # Go to next line and increase step size when you are far away
        z += dz
        dz += 0.2

# Call the render function with the camera parameters:
# position, viewing angle, height, horizon line position, 
# scaling factor for the height, the largest distance, 
# screen width and the screen height parameter
Render( Point(0, 0), 0, 50, 120, 120, 300, 800, 600 )

链接

Web项目demo 页面

体素地形引擎简介

个人网站

地图

颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


颜色高度


0
0
评论 共 1 条 请登录后发表评论
1 楼 d2344655 2017-12-04 23:55
非常厉害

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • MATLAB算法实战应用案例精讲-【图像处理】三维重建(附MATLAB和python代码实现)

    医学领域的三维重建技术 代码实现 MATLAB 基于切片的三维重建MATLAB仿真 基于正弦结构光的三维重建(MATLAB) 医学三维重建(MPR) 基于Matlab的双目视觉三维重建技术 python 三维重建算法Structure from Motion(Sfm)...

  • 真实感水体渲染技术总结

    需要注意的是,上面列出的时间点,可能并不是严格意义上的该技术提出的时间点,而是该技术在论文或会议上被提出,被大众熟知,被引入到水体渲染技术中的时间点。 接下来,先看一些近年游戏中的真实感水体渲染画面...

  • 渲染书籍目录汇总(不断更新中...)

    渲染是一个令人着迷的方向,可学习渲染着实有不小的难度。 渲染技术不断在发展,各种技术层出不穷,相关英文资料(中文相对少了很多)更是多如牛毛。 那么如何快速找到自己需要的资料呢? 为了帮助自己和广大渲染...

  • CryEngine3渲染引擎剖析

    不过我是一个信仰黑客精神的程序员,也非常支持KlayGE的研发,希望发一些我的原创资料,和作者,以及KlayGE的作用者交流,甚至有一些麻烦的问题,也希望作者可以解答,如果KlayGE的研发能够涉及到这些东西,那就最好...

  • 【GPU精粹与Shader编程】(七) 一篇文章读完《GPU Gems 3》

    然而,生成复杂地形是一项高度并行化的任务,CPU的串行处理本质上不适合完成这项工作。此外,CPU生成高度场的方法也无法很好地提供吸引人的地形特征(如凹洞和凸起物)。为了交互级的帧率下生成高度复杂的程序化地形...

  • [gdc13]《刺客信条3》渲染技术

    地形是地形,上面的雪是有专门的雪的mesh 在做雪痕的时候,是把雪的mesh在index buffer上面做调整,中间挖出洞 补上一个displacement map+tessellated triangle做出雪痕的形状 tessellation这部分比较直接,在可以r2...

  • 基于LOD的大规模真实感室外场景实时渲染技术的初步研究

    基于LOD的大规模真实感室外场景实时渲染技术的初步研究 西北工业大学软件学院,R093班 学生:潘李亮 学号:993754 2003 年 4 月 关键字与术语 LOD , (level of detail)、ROAM ( Real-time optimize adaptive...

  • 虚幻4地形怎么增加层_虚幻周报20200512 | 该来的总会来的!

    官方知乎号:虚幻引擎搜集日期:20200427-20200510整理编辑: 大钊,小辉辉,马古斯,小帅帅 声明:文档... 不说你们也知道,又更新了一大波酷炫的功能,自己去看版本说明:虚幻引擎4.25版本说明精选免费商城内容...

  • Cryengine渲染引擎剖析

     这个帖可能在这儿发比较奇怪,不过我是一个信仰黑客精神的程序员,也...作为一个刚从业不久的引擎开发人员,为了能快速有效地提高自己引擎的渲染质量,使用了各种办法来解析Cryengine的渲染手法。在此我将以专业

  • 《Gpu Gems》《Gpu Pro》《Gpu Zen》系列读书笔记

    本篇blog简单记录了一下最近一两年一直在读的一系列书目。《Gpu Gems》1-3三部,《Gpu Pro》1-7七部,《Gpu ...针对每一项渲染技术,进行全系列书的总结,从这个角度来看,可以看到一项技术,近十五六年来的进化过程。

  • Cryengine渲染引擎剖析(转)

    不过我是一个信仰黑客精神的程序员,也非常支持KlayGE的研发,希望发一些我的原创资料,和作者,以及KlayGE的作用者交流,甚至有一些麻烦的问题,也希望作者可以解答,如果KlayGE的研发能够涉及到这些东西,那就最好...

  • 游戏思考17:寻路引擎recast和detour学习二:recast导航网格生成流程\源码剖析流程\局限性,附录计算点线面举例代码

    网格导航的生成和局限性、流程和代码解析

  • 计算机视觉论文-2021-11-02

    流感病毒,艾滋病病毒, CV 病毒】 亮点:在目前的工作中,我们提出了一种新的速度场估计范式,实现了深度学习方法和传统的互相关方法的协同结合。 标题:Deep Dose Net :用于放射治疗中三维剂量预测的深度学习模型...

  • 【GPU精粹与Shader编程】(八) 《GPU Pro 1》全书核心内容提炼总结

    在游戏《孢子(Spore)》中,使用了可编程过滤链系统(scriptable filter chain system)在运行时对帧进行处理,以实现游戏整体独特的风格化渲染。(注,在本文中,filter按语境,译为滤波或者过滤)。 图 ...

  • 从DOOM到CE3 20年3D游戏引擎发展史漫谈

    同样只有两作,分别是未来冲击和天网)    随着时代进步,从简单的色块堆砌而成的画面到数百万多边形组成的精细人物,游戏正展示给我们越来越真实且广阔的世界,对于近几年才接触游戏的玩家来

  • [转]Cryengine渲染引擎剖析

    转篇Napoleon314 大牛的分析,排版好乱,见谅,耐心读,这是个好东西,注意看他自己的实现,是个技术狂人啊,Ogre焕发次时代的光芒啊~~~努力 -------------------------------------------------------------------...

  • qtz40塔式起重机总体及塔身有限元分析法设计().zip

    qtz40塔式起重机总体及塔身有限元分析法设计().zip

  • elasticsearch-8.17.4-windows-x86-64.zip

    Elasticsearch是一个基于Lucene的搜索服务器

  • 《基于YOLOv8的核废料处理机器人导航避障系统》(包含源码、可视化界面、完整数据集、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

Global site tag (gtag.js) - Google Analytics