Catlike Coding网站文章解析 -- 2.Procedural Grid

本章内容

  • 创建一个闭合的cube mesh
  • 给cube添加带弧度平滑的边缘
  • 定义法线
  • 使用sub-meshes(子mesh)
  • 创建一个常规shader
  • 合并碰撞体

1.合成一个cube

上一章https://mp.csdn.net/postedit/89474068我们已经实现了一个平面mesh。一个cube由6个平面组成,我们可以由6个上一章实现的平面修改位置和方向后组成一个cube,这种方法看起来挺好,但是其实并不实用,虽然我们也可以过 Mesh.CombineMeshes这个函数合并这6个mesh,但是我们最好还是一次性创建这个cube。

2.创建cube的顶点

一个cube中的顶点可以分为三类。角上的顶点(下图3),边上的顶点(下图2)以及面上的顶点(下图1)

具体每个种类多少其实就是算数学题,具体如何算的可以参考原文,最后计算定点数量代码如下 

 之后再计算每个顶点的位置,最后结果如下

 

 3.添加三角形

 具体实现方法类似之前的文章,但是涉及更多的数学知识,这里不细讲了,大体思路是先计算cube四周的四个面,之后计算上面(top)和下面(bottom)。最后效果如下

4.使边缘圆滑

基于之前的代码,重新创建一个类命名为RoundedCube,并添加一个Roundness变量用于控制圆滑程度

这回我们要自己计算法线。先定义法线数组

创建一个函数,用于计算法线以及使得顶点沿着法线位置变化形成弧度

 计算法线的原理是依据roundness参数形成一个更小的cube,大cube和小cube之间顶点的向量差就是大cube上该点的法线。如下图所示:

 通过roundness参数,来确定大cube上每个顶点对应的小cube位置

最终结果

5.拆分Mesh

如何计算UV使得其可以渲染纹理?我们可以将总的三角形列表拆分成多个子mesh(三角形列表),其之间共用一些相同的顶点,这也使得我们可以使用不同材质去渲染每一组子三角形列表。

创建三个子列表

计算每个三角形列表

不再是设置mesh.triangles  而是设置子mesh

如果只设置一个材质,那么会发现只有两个面会渲染(一组)

 在mesh render中material array设置三个材质,会得到正确结果

 6.渲染Gird

我们可以使用shader,在shader中指定如何计算使用一个纹理而代替在mesh中存储uv信息。

Unity中默认shader的代码如下:

因为我们mesh中没有uv信息,我们需要在shader中计算,所以我们在顶点着色器中计算uv信息,并将其传入到surface shader中

通过使用shader中的keyword,我们可以控制shader的渲染

根据所设置的keyword提供支持 

根据所选keyword设置来进行uv计算

可以看出同一个shader通过设置keyword来提供三个material对应的效果

 但是能看出来grid line没有和四边形完全对应上,更糟的是因为我们使用的是世界坐标系,当我们旋转和移动这个cube的时候效果会更奇怪。

我们需要使用的是在圆滑之前原始的cube中的顶点位置,因此我们通过将其存储在mesh中传入shader。因为我们这个例子中vertex color channel没有用,所以我们就用它来存储这个信息。

在shader中使用color channel存储的信息进行计算

7.添加碰撞体

添加一个碰撞体时候的样子

为平坦的部分添加box collider(共三个) 

为圆滑边缘添加capsule collider(12个)

最后的效果

https://thumbs.gfycat.com/RingedCornyBlesbok-mobile.mp4

 

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

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

相关文章

GPU Gems1 - 23 景深技术综述

本章主要介绍如何使用GPU创建实时的景深(Depth of Field)效果。参考浅墨总结文章的链接https://zhuanlan.zhihu.com/p/36499291 聚焦在枪上,背景模糊【核心要点】 物体在距离镜头的一个范围之内能够清晰成像(经过聚焦&#xff09…

GPU Gems1 - 22 颜色控制(Color Controls)

这章将在游戏中图像处理的讨论,扩展到技术和艺术上控制颜色的方法和应用,包括将图像从一些的色彩空间中移入移出,以及快速地给任何2D或3D场景加上精美的色调。 色彩校正(Color Correction)是几乎所有印刷和胶片成像应…

GPU Gems1 - 25 用纹理贴图进行快速过滤宽度的计算

这章介绍在片元shader中计算导数近似值的技术。这个技术把特别的值载入纹理mipmap的每个级别,以特殊的方式使用纹理映射硬件,计算出导数的结果,给出在屏幕上的像素间某个量的变化率。 Cg标准程序库提供ddx和ddy函数,计算任意关于…

GPU Gems1 - 24 高质量的过滤

在一些应用中,高质量的过滤是至关重要的,可以用像素shader代码执行任何过滤。GPU着色程序不用于CPU的主要之处在于:一般来说,CPU数学操作比纹理访问更快,而在GPU中恰恰相反。图像过滤的目的很简单:对于给你…

GPU Gems1 - 26 OpenEXR图像文件格式与HDR(The OpenEXR Image File Format and HDR)

【章节概览】 这章中,大名鼎鼎的工业光魔公司的Florian Kainz、Rod Bogart和DrweHess介绍了OpenEXR标准,这是一种当时新的高动态范围图像(HDRI)格式,在计算机成像的顶级电影中正在快速推广。对于基于图像照明的开发者…

ID Tech 5 中Megatexture针对地形的D3D9 基本实现原理

看GPU Gems2中的 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)一文,对Clipmap技术不是理解很好,所以上网搜索一番,发现了这篇文章,实在是太棒的文章&#xff…

[知乎] 开放世界游戏中的大地图背后有哪些实现技术?

今天看到的一篇关于大世界的技术文章,写的太好了,膜拜大佬。各位如果有时间一定要看看 原文:http://gulu-dev.com/post/2014-11-16-open-world#toc_10 一、程序技术篇:算法和架构(Programming Algorithms & Arch…

GPU Gems2 - 2 使用基于GPU几何体裁剪图的地形渲染(Terrain Rendering Using GPU-Based Geometry Clipmaps)

【章节概览】 本章描述了一种通过顶点纹理实现的,基于GPU的几何体裁剪图(Geometry Clipmaps)技术。通过把地形几何体当做一组图像来处理,可以在GPU上执行几乎所有的计算,因此可以减少CPU的负载。且该技术较为容易实现…

球谐光照

一.原理 球谐光照实际上是一种对光照的简化,对于空间上的一点,受到的光照在各个方向上是不同的,也即各向异性,所以空间上一点如果要完全还原光照情况,那就需要记录周围球面上所有方向的光照。注意这里考虑的周围环境往…

图像色调,饱和度,对比度等相关定义

RGB颜色模型 RGB颜色模型也就是我们最常用的三原色,红绿蓝。RGB颜色模型在混色时属于加法混色,RGB中每种颜色数值越高,色彩越明亮。RBG为(0,0,0)时为黑色,RGB为(255,255,255)时为白…

各Rendering Path技术以及其在Unity中的实现

Rendering Path其实指的就是渲染场景中光照的方式。由于场景中的光源可能很多,甚至是动态的光源。所以怎么在速度和效果上达到一个最好的结果确实很困难。以当今的显卡发展为契机,人们才衍生出了这么多的Rendering Path来处理各种光照。 一. 正向渲染Fo…

GPU Gems2 - 3 几何体实例化的内幕(Inside Geometry Instancing)

文章部分内容摘自 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章讨论了在Direct3D中渲染一个几何体的许多独特实例(Instance)的技术细节问题,对几何体实例(Geometry Instancing)的技术内幕进行了分析。 【…

GPU Gems2 - 4 分段缓冲(Segment Buffering)

文章参照该文 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 本章介绍了一项可以明显减少一个显示帧中渲染的批次数目的技术——分段缓冲(segment buffering),以及其改进。 【核心要点】 分段缓冲(segment buffering&…

GPU Gems2 - 6 用多流来优化资源管理(Optimizing Resource Management with Multistreaming)

本文摘自https://zhuanlan.zhihu.com/p/38411575 【章节概览】 现代实时图形应用程序最困难的问题之一是必须处理庞大的数据。复杂的场景结合多通道的渲染,渲染起来往往会较为昂贵。 首先,多流(Multistreaming)技术由微软在Dire…

GameObject数组逐渐消失

GameObject数组逐渐消失 我做了10个物体需要每隔俩秒消失一个。 我是这样做的: 我先梳理出大概我需要怎么做的,第一步先引用预制体然后再创建一个数组最后是代码主体。 在start里先把起始时间设好,然后再看Nos方法time是让他时间自己在加&am…

Unity SRP自定义渲染管线 -- 1.Custom Pipeline

该篇是对Catlike Coding这篇文章的概要总结,本人能力有限,如果有不正确的地方欢迎指正 https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/custom-pipeline/ 通过这篇文章,你将学习到 Create a pipeline asset and i…

GPU Gems2 - 7 带位移映射的细分表面自适应镶嵌

文章参照该文 https://zhuanlan.zhihu.com/p/38411575 【章节概览】 这章介绍了如何使用可选的位移贴图(Displacement Mapping)执行Catmull-Clark细分曲面(Catmull-Clark Subdivision Surfaces)的视图相关的自适应镶嵌&#xff0…

GPU Gems2 - 8 使用距离函数的逐像素位移贴图

【章节概览】 距离贴图(distance map)是一种在像素着色器中给对象添加小范围位移映射的技术。这章中详细介绍了使用距离函数的逐像素位移贴图(Per-Pixel Displacement Mapping with Distance Functions)技术。 【核心要点】 这章中…

GPU Gems2 - 9 S.T.A.L.K.E.R.中的延迟着色(Deferred Shading in S.T.A.L.K.E.R.)

关于延迟着色的详细技术及最新渲染管线技术可以参考我的这篇文章: https://blog.csdn.net/yinfourever/article/details/90263638 【章节概览】 本章是对《S.T.A.L.K.E.R.》中所用渲染器的几乎两年的研究和开发的事后剖析。该渲染器完全基于延迟着色(De…

GPU Gems2 - 10 动态辐照度环境映射实时计算

【章节概览】 环境映射(Environment Maps)是常用的基于图像的渲染技术,用来表现以空间上不变的球面函数。本章描述了一种完全GPU加速的方法,来生成一个环境映射在图形上特别有趣的类型——辐照度环境映射(Irradiance …