原文英文版链接https://catlikecoding.com/unity/tutorials/procedural-grid/,里面有每一部分的untiy工程链接,文章内容也更详实。

本章内容:

  • 创建一系列点
  • 使用协程实现他们的摆放位置
  • 定义一个由三角形组成的平面
  • 自动生成法线
  • 添加纹理坐标和切线

1.渲染啥

你如果想在unity中看见什么东西,那你肯定需要一个mesh。它可能是一个由其他软件导出的3D模型或者是程序化生成的mesh。它可能是一个sprite,UI元素或者粒子特效,总之在unity里你想看到点东西你就得用mesh去渲染。

所以mesh是个啥?从概念上讲,一个mesh是图形硬件用于渲染复杂东西的一系列数据组合,它至少包括顶点的集合以及一系列三角形。三角形是最基本的2d图形,它连接了三个点,无论mesh是什么样,都是这些三角形组成了每个平面。

三角形平坦且边缘直,可以完美的展示平坦平直的东西,比如一个立方体的面。带弧度或者凹进去的平面只能通过大量小三角形近似模拟。如果这些小三角形足够小,小于一个像素,那你对这种近似就没有感知。但是对于实时的渲染不太可行,这些平面(圆弧的面)在某些角度看上去会有锯齿。

Unity's default capsule, cube, and sphere, shaded vs. wireframe

在unity中渲染3D物体需要两个组件mesh filter 和 mesh rendere,filter指向你想要渲染的mesh(渲染what),renderer定义如何渲染(how 怎么渲染)。

提供一个albedo颜色贴图可以是最简单便捷的方式使得mesh渲染时富有细节。通过UV坐标,可以实现贴图的采样从而进行渲染。

2.创建一系列顶点

如何创建自己的mesh?

创建C#Grid类

using UnityEngine;
using System.Collections;
public class Grid : MonoBehaviour {public int xSize, ySize;
}

自动添加所需的component

[RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
public class Grid : MonoBehaviour {public int xSize, ySize;
}

Awake方法里调用Genrate函数

private void Awake () {Generate();}

由下图所示,对于大小横向为x纵向为y的grid,实际需要的顶点数量是 (x+1) * (y+1)

创建顶点数组并赋予其每个点位置

private void Generate () {vertices = new Vector3[(xSize + 1) * (ySize + 1)];for (int i = 0, y = 0; y <= ySize; y++) {for (int x = 0; x <= xSize; x++, i++) {vertices[i] = new Vector3(x, y);}}}

Gizmos调试

   private void OnDrawGizmos () {Gizmos.color = Color.black;for (int i = 0; i < vertices.Length; i++) {Gizmos.DrawSphere(vertices[i], 0.1f);}}

Gizmos的效果(x = 10 y = 5)

3.创建Mesh

之后需要为mesh设置三角形片元,这里设置的值其实是之前顶点数组的索引,也就是数组的下标。

上边这么设置三个点,是啥也看不到的,因为这三个点在一条线上,无法组成三角形

triangles[0] = 0;
triangles[1] = 1;
triangles[2] = xSize + 1;

这么设置组成了三角形,但是也看不到,这是因为这个顺序是逆时针顺序,会被判定为背面,渲染时会被剃除

顺时针是正面,逆时针是反面

按如下设置,我们将会得到第一个三角形

                                 triangles[0] = 0;triangles[1] = xSize + 1;triangles[2] = 1;

有了第一个三角形后,我们可以绘制两个三角形拼成一个正方形

之后我们就可以生成每一行,完整代码如下

private void Awake () {Generate();}private void Generate () {GetComponent<MeshFilter>().mesh = mesh = new Mesh();mesh.name = "Procedural Grid";vertices = new Vector3[(xSize + 1) * (ySize + 1)];for (int i = 0, y = 0; y <= ySize; y++) {for (int x = 0; x <= xSize; x++, i++) {vertices[i] = new Vector3(x, y);}}mesh.vertices = vertices;int[] triangles = new int[xSize * ySize * 6];for (int ti = 0, vi = 0, y = 0; y < ySize; y++, vi++) {for (int x = 0; x < xSize; x++, ti += 6, vi++) {triangles[ti] = vi;triangles[ti + 3] = triangles[ti + 2] = vi + 1;triangles[ti + 4] = triangles[ti + 1] = vi + xSize + 1;triangles[ti + 5] = vi + xSize + 2;}}mesh.triangles = triangles;}

最后效果如下:

4.生成其他顶点数据

法线

我们还没有给我们生成的mesh赋予法线,默认的法线方向是(0,0,1),这并不是我们想要的。

每个Vertex(顶点)都需要设置法线,我们可以自己再创建一个数组来设置法线。还有更好的办法,用unity提供的功能,调用mesh中的RecalculateNormals函数,它会根据之前设置好的三角形数据自动计算法线。对于某个vertex,法线的计算是对包含该vertex的所有三角形的法线取平均值,并归一化。

有了法线才能进行光照的计算

UV坐标

默认UV坐标都是0,所以我们必须为每个vertex顶点设置UV坐标,UV坐标范围是0到1,所以设置方法如下

上边的代码不会正确的显示结果,这是因为我们应该使用float来计算UV而不是整数除法

我们可以通过设置贴图的tiling属性来达到一些效果

法线贴图

我们可以用法线贴图来给渲染增加更多效果。关于法线贴图的原理和技术请自行学习吧

目前法线贴图的信息是存储在切线空间(切线空间的知识请自行学习),所以我们需要为mesh中的顶点设置切线信息。因为我们目前做出来的是一个平坦的平面,所以切线信息很好设置,平行于平面。

法线贴图在一个平面上的效果,明明是一个平面,但是视觉上却有凹凸起伏的感觉

Catlike Coding网站文章解析 -- 1.Procedural Grid相关推荐

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

    本章内容 创建一个闭合的cube mesh 给cube添加带弧度平滑的边缘 定义法线 使用sub-meshes(子mesh) 创建一个常规shader 合并碰撞体 1.合成一个cube 上一章http ...

  2. 如何做网络推广浅析网站文章的结构对优化的重要性!

    如何做网络推广表示,合理的收录不仅能有效地提高网站的排名,还会涉及到更多的问题,可见,网站的收录情况是多么的重要.作为网站内容文章也是影响收录的因素之一,今天如何做网络推广就带大家一起来了解一下网站文 ...

  3. 网络推广策略之网站文章收录少的时候都是哪些因素导致的?

    网络推广策略中在网站的优化中,对于网站文章收录的问题也是让优化人员着急也不得行的工作,因为有时候影响网站文章收录的因素太多了,不知该如何下手,下面就带大家一起来了解一下文章收录少的原因都有哪些?优化人 ...

  4. 网站文章要求图文并茂,图片要怎样做好优化工作呢?

    在网站运营优化过程中,很多站长都会下大力气去优化网站文章,力求做到图文并茂,最终呈现出高品质的网站内容.不过想要做到图文并茂,网站图片的优化自然也少不了,那么站长们在针对图片优化工作中是怎样进行的呢? ...

  5. 网站优化之网站文章更新需注意哪些问题?

    网站内容优化是网站优化中非常重要的一种优化过程,对网站文章进行优质的优化也会对网站的排名和权重有一定的帮助,对网站的基础优化也有更多的帮助,那么在网站优化中,文章更新都需要注意哪些问题才能提升网站排名 ...

  6. 网站文章中如何设置关键词才更有利于SEO优化?

    文章内容在网站优化中占据重要的分量,文章内容的高质量会非常有助力网站排名提升,更能给网站带来更多的流量.那么在网站优化中,如何设置文章内容的关键词才能更利于网站SEO优化? 一.文章的关键词要有合适的 ...

  7. 影响SEO网站文章收录的因素有哪些?

    众所周知,网站文章的收录良好不仅对网站排名有帮助还非常利于吸引更多的用户浏览.但有些时候优化人员也每天都在更新高质量文章,但搜索引擎总是不收录,也引得优化人员百思不得其解,那么接下来就带大家了解一下网 ...

  8. 网站文章不收录怎么办!

    相信每个编辑在处理网站优化文章的时候都期待自己的文章能够百分百被搜索引擎收录,但是这哪里是那么简单的事情呢?那么如何提高网站的收录几率呢? 1. 了解用户需求 在网站优化中最重要的就是了解用户的需求, ...

  9. 文章如何做伪原创 SEO大神教你几招做原创网站文章的心得

    想要创作出好的文章并被百度所喜欢,就非常需要SEO的优化能力,以及要对文章进行塬创或伪塬创,那么,如何做伪塬创文章?以及如何做好塬创网站文章呢?对此,本文小编就为大家带来了几招做"塬创&qu ...

最新文章

  1. Asp.net(C#)-彩色图片转化为黑白
  2. linux mysql无符号整型_Mysql基础
  3. 【LeetCode】50. Pow(x, n) (3 solutions)
  4. bugly怎么读_高级功能
  5. CentOs简单分区方案
  6. dvwa如何打开_DVWA详细 安装
  7. 前端判断是否为空字符窜
  8. Tensorflow c api
  9. 读取脑磁波,神经网络知道你在「犹豫不定」
  10. 【优化算法】多目标萤火虫算法(MOFA)【含Matlab源码 1595期】
  11. 机器人操作系统ROS简介
  12. 计算长方体、四棱锥的表面积和体积_JAVA
  13. python运算符计算集合并集_Python集合、集合的运算、集合方法详细讲解
  14. StarGFS海量小文件的高性能存储和保护方案
  15. @Value注解使用过程中遇到的一些坑
  16. Neuraltalk2
  17. 企业如何建立完善的管理体系
  18. 格里高利历java_格里高利历java错误
  19. Python语言基于Socket实现聊天室(包含登录、注册功能)
  20. eas java配置_EAS客户端调试环境搭建

热门文章

  1. D - 邂逅明下 HDU - 2897(有点水平的巴什博奕)
  2. codeforces 1038a(找最长的前k个字母出现相同次数的字符串)水题
  3. codeforces 1041a(水题)
  4. *PAT_B_1052_C++(20分)
  5. 单链表进阶学习 二段
  6. 深度学习之自编码器(2)Fashion MNIST图片重建实战
  7. bazel 链接第三方动态库_惠州权威信息系统安全检测第三方
  8. 图论-网络流-Dinic (邻接表版)
  9. [深度学习] 自然语言处理 --- 基于Attention机制的Bi-LSTM文本分类
  10. 关于自旋锁的一些文章摘记