文章目录

  • 1. 绪论
  • 2. 概述
  • 3. 详论
    • 3.1. 准备
    • 3.2. 实现
    • 3.3. 解析
      • 3.3.1. 场景树对象
      • 3.3.2. 绘制方法
  • 4. 结果

1. 绪论

最近想学习一下Unity3d,无奈发现现在大部分教程不仅是视频形式的,面对的也是美术、设计之类的非程序员,更多的时候都是把Unity3d当作PS一样的工具来用,真正面对程序开发的教程反而非常少,更不用说希望能研究到一些底层图形技术的技术工作者了。

说一下我看的两本Unity3d书籍吧。第一本是《Unity 3D游戏开发(第2版)》(宣雨松 著)。这本书算是大部分教程书籍中评价比较好的了,很多人推荐。不过个人感觉作者对Unity3D的知识有了太多的积累,已经忘记了初学者初学Unity3D的心态,知识也显得比较零散。不过这也是国内大多数书籍的通病了,更像是作者对知识的总结而不是成体系的向读者介绍知识。建议初学者看这本书一定要实操,喜欢头脑风暴的同学不适合这本书。

看的第二本书是《Unity Shader入门精要》(冯乐乐 著)。令人佩服的是这本书是位程序媛写的,可能正是因为如此,这本书写的确实非常细致到位。尤其是前面几章对渲染管线的描述,从Unity3D图形技出发,已然上升到计算机图形学的高度上,对学习其他的图形技术也有非常大的帮助(毕竟很多图形技术都是通用的)。当时看了觉得确实很不错,因此还送了同事一本。

最后就是自己也想总结一下Unity3D的相关知识吧,本身是个程序猿,当然更多的会偏向游戏开发的程序员角度,或者图形技术的程序员的角度一点。

2. 概述

图形渲染技术的第一个HelloWorld当然应该就是绘制一个三角形了。在绝大多数情况下,三角面是渲染物体的基础图元。作为高级的渲染引擎,像三角面这样的几何体甚至不需要我们去通过代码来绘制,但是却是我们学习的基础,立足于这个基础,我们以后能够渲染更加复杂的图形。

3. 详论

3.1. 准备

通过Unity Hub创建一个3D工程:

进入Unity3D环境,通过右键菜单,在"Hierarchy"视图中添加一个名为"Root"空的GameObject:

GameObject对象是Unity3D中得一个基础类,Unity3D中得绝大部分对象都是基于它实现的,比如相机、灯光、或者模型等。所以我们这里把创建的名为Root的GameObject对象作为场景的根节点。

在Root对象的Inspector面板中,可以看到一个"Add Component"按钮:

也就是说,通过"Add Component"按钮,我们可以挂接一些组件,这样,空的GameObject对象就成为了其他类型的对象。例如,我这里挂接一个C#脚本,通过C#脚本来绘制物体,那么这个GameObject,表示的就是一个渲染的物体。

在"Project"视图中,通过右键菜单创建一个C#脚本:

通过Root对象的Inspector面板中的"Add Component"按钮,将这个脚本,挂接到Root对象下:

3.2. 实现

通过"Project"视图的右键菜单中打开这个C#工程,可以看到我们添加的脚本"Main.CS":

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Main : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){}// Update is called once per framevoid Update(){        }
}

这个脚本提供了两个方法:

  1. Start()表示初始化(第一帧)的时候需要更新的内容,通常用于初始化之后不再更新的内容。比如我们会在这里绘制一个物体。
  2. Update()表示每一帧都需要实时更新的内容,比如相机与鼠标键盘事件的交互。

那么就在Start()中进行绘制一个三角形的操作:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class Main : MonoBehaviour
{// Start is called before the first frame updatevoid Start(){GameObject main = GameObject.Find("/Root");if (main == null){return;}GameObject triangleGameObject = GreateTriangle();triangleGameObject.transform.parent = main.transform;}GameObject GreateTriangle(){string name = "triangle";Mesh mesh = new Mesh();mesh.name = name;Vector3[] vertices = new Vector3[3]{new Vector3(0, 0, 0),new Vector3(0, 10, 0),new Vector3(10, 0, 0)};        mesh.vertices = vertices;int[] triangles = new int[3] { 0, 1, 2 };mesh.triangles = triangles;GameObject triangleGameObject = new GameObject(name);MeshFilter mf = triangleGameObject.AddComponent<MeshFilter>();mf.sharedMesh = mesh;MeshRenderer meshRenderer = triangleGameObject.AddComponent<MeshRenderer>();return triangleGameObject;}// Update is called once per framevoid Update(){        }
}

3.3. 解析

3.3.1. 场景树对象

在Start()函数中,首先我们找到了场景根节点Root,然后又通过调用GreateTriangle()函数,创建了一个三角形的GameObject对象,最后把这个三角形对象挂接到Root对象下:

void Start()
{GameObject main = GameObject.Find("/Root");if (main == null){return;}GameObject triangleGameObject = GreateTriangle();triangleGameObject.transform.parent = main.transform;
}

可以看到子对象挂接到父对象是通过GameObject对象中Transform对象来挂接的,这其实体现了一种思维的体现:Transform其实是表达GameObject对象空间位置的的4X4矩阵,父节点设置Transform会影响到子节点的位置,子节点的初始位置都是基于父节点的Transform开始计算的。通过这种方式,再复杂的场景也可以组织成一个场景树节点:

3.3.2. 绘制方法

经过图形技术的多年发展,现在大部分图像渲染引擎都会把渲染的物体封装成两种对象:渲染物体的骨架封装成Mesh(网格),因为绝大多数物体都是通过一个个三角面片渲染出来的;渲染物体的血肉封装成Material(材质),影响最终渲染的效果,如物体的光感、质地。

所以,为了绘制一个三角形,当然应该先绘制一个Mesh:

GameObject GreateTriangle()
{string name = "triangle";Mesh mesh = new Mesh();mesh.name = name;Vector3[] vertices = new Vector3[3]{new Vector3(0, 0, 0),new Vector3(0, 10, 0),new Vector3(10, 0, 0)};        mesh.vertices = vertices;int[] triangles = new int[3] { 0, 1, 2 };mesh.triangles = triangles;//...
}

这里,我们给Mesh传入了三个顶点,以及顶点的三角面索引。三角面索引表示的是按照索引的顺序,通过顶点进行绘制,这样就可以使用较少的顶点进行绘制,节约空间,毕竟Mesh中很多三角面片是共顶点的。

接下来,给GameObject增加一个MeshFilter组件,通过这个组件挂接刚创建的Mesh;给GameObject增加一个MeshRenderer组件,这个组件是用来挂接Material的,不过暂时没有用上Material(但是必须增加MeshRenderer组件,否则不会显示物体)。

GameObject GreateTriangle()
{//...GameObject triangleGameObject = new GameObject(name);MeshFilter mf = triangleGameObject.AddComponent<MeshFilter>();mf.sharedMesh = mesh;MeshRenderer meshRenderer = triangleGameObject.AddComponent<MeshRenderer>();return triangleGameObject;
}

4. 结果

点击"Play",运行结果如下:

Unity3D学习笔记1——绘制一个三角形相关推荐

  1. Unity3D学习笔记3——Unity Shader的初步使用

    文章目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. ...

  2. QT使用openGL绘制一个三角形

    对于opengl的学习来说,绘制一个三角形是学习一种计算机语言时的一个hello world级的入门程序,个人觉得相比主流语言的helloworld,openGL的入门确实是有一些劝退,虽然说有不错的 ...

  3. OpenGL学习笔记(八):进一步理解VAO、VBO和SHADER,并使用VAO、VBO和SHADER绘制一个三角形

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7888 ...

  4. OpenGL学习脚印: 绘制一个三角形

    写在前面 接着上一节内容,开发环境搭建好后,我们当然想立即编写3D应用程序了.不过我们还需要些耐心,因为OpenGL是一套底层的API,因而我们要掌握的基本知识稍微多一点,在开始绘制3D图形之前,本节 ...

  5. Unity3D学习笔记6——GPU实例化(1)

    文章目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成 ...

  6. Unity3D学习笔记8——GPU实例化(3)

    文章目录 1. 概述 2. 详论 2.1. 自动实例化 2.2. MaterialPropertyBlock 3. 参考 1. 概述 在前两篇文章<Unity3D学习笔记6--GPU实例化(1) ...

  7. Unity3D学习笔记:粒子特效参数

    Unity3D学习笔记:粒子特效参数含义 转载 https://blog.csdn.net/asd237241291/article/details/8433534 粒子特效 粒子系统检视面板 初始化 ...

  8. Unity3D学习笔记12——渲染纹理

    文章目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实 ...

  9. python绘制如下图形、小三角形边长20_OpenGL学习脚印_ 绘制移动三角形 - 王定桥的专栏.pdf...

    OpenGL学习脚印_ 绘制移动三角形 - 王定桥的专栏 2015/7/20 OpenGL学习脚印: 绘制移动三角形 ­ 王定桥的专栏 ­ 博客频道 ­ CSDN.NET 登录 | 注册 王定桥的专栏 ...

最新文章

  1. UML for Java Programmers之dx实战
  2. 计算机视觉顶尖期刊和会议的段子
  3. Flutter开发之名篇及demo收录
  4. 【基础算法-模拟-例题-*校长的问题】-C++
  5. watir添加新标签
  6. Ubuntu终端Terminal常用快捷键
  7. python中argsort,sort 和 sorted,operator.itemgetter函数
  8. linux 命令博客,Linux命令(一)
  9. WCMS V9方向说明
  10. 2018年阿里巴巴关于java重要开源项目汇总
  11. Hbase的table存储详解
  12. Bat文件闪退_启动失败
  13. 夜神模拟器开启网络桥接模式共享局域网ip
  14. lua系统学习02-变量
  15. HTML5期末大作业:旅游出行网站设计——武汉旅游(11页) HTML+CSS+JavaScript dreamweaver作业静态HTML网页设计模板
  16. 题目二:课程设计报告
  17. 操作Mongodb数据库及性能测试
  18. 学Python最基本20个代码__1
  19. 实践基地+新工科实训 青软与西南大学展开多元校企合作
  20. VR数字沙盘高度还原未来房屋实景

热门文章

  1. ArcGIS Server常见问题
  2. oracle数据库超级解锁,oracle数据库锁,解锁,批量解锁
  3. Mac m1配置OpenGL(C++)
  4. 鸿蒙dnf是真的么,DNF:唯一“双神话”SS套,属性强到改变职业,凑齐它永久告别深渊...
  5. 中国浏览器市场份额状况(2010年4月)360浏览器对IE构成最大威胁
  6. 百战商城(十二)-项目部署
  7. 【独立版】变现宝小程序V1.1.0知识付费小程序
  8. HTML table表单colspan和rowspan行列使用方法
  9. 荣耀畅玩7C设置语言步骤,荣耀畅玩7C怎么截图?华为荣耀畅玩7C手机截屏方法图文详解...
  10. CDH 1、CDH简介