团结引擎之光照和纹理


前言

本文将介绍 团结引擎中光照和纹理的工作方式。
团结引擎中光照的工作方式类似于光在现实世界中的情况。 团结引擎使用详细的光线工作模型来获得更逼真的结果,并使用简化模型来获得更具风格化的结果。纹理是覆盖或包裹游戏对象以赋予它们视觉效果的图像或电影文件。
在这里插入图片描述


一、光源类型

  1. Point Light:位于场景中某一点并向所有方向均匀发光的灯光
  2. Spot Light:位于场景中某一点并以锥形发光的灯光
  3. Directional Light:一种位于无限远处的光,只向一个方向发光
  4. Area Light:一种灯光,由场景中的矩形或圆盘定义,在其表面区域的所有方向上均匀发光,但仅从矩形或圆盘的一侧发出

二、剪影

为内置渲染管线创建剪影的最便捷方法,是创建一个灰度纹理,将该纹理导入 Unity,然后 Unity 将纹理的亮度转换为 Alpha。

请注意:在内置渲染管线中,剪影仅使用来自 Alpha 通道的数据。这意味着您可以为剪影定义形状,而不是定义颜色。
一种用于体现窗户光线的简单灰度剪影
一种用于体现窗户光线的简单灰度剪影
在这里插入图片描述
为此需要执行以下操作:

  1. 在您选择的图像编辑器中创建灰度纹理。如果你要创建一个与点光源一起使用,请将你的纹理排列成立方体贴图。如果要创建与聚光灯或平行光一起使用的cookie,请将纹理布局为常规的2D纹理。
  2. 将纹理放在项目的 Asset 文件夹中以将纹理导入 Unity。
  3. 在 Project 视图中,选择代表纹理的纹理资源。Unity 在 Inspector 中显示纹理导入设置。
  4. 在 Inspector 中,设置以下值:
    将 Texture Type 设置为 Cookie
    将 Light Type 设置为与要为其创建剪影的光线类型一致
    将 Alpha Source 设置为 From Gray Scale。
  5. 在 Inspector 底部,单击 Apply。Unity 将更新的导入设置应用于纹理资源。

请注意,剪影的像素不需要完全透明或不透明,但也可以包含两者之间的任何值。可以使用中间值来模拟光路中的灰尘或污垢,或模拟焦散效果,例如汽车前灯中的脊产生的效果。

三、光照贴图

选择 Window > Rendering > Lighting 从Unity编辑器菜单打开照明窗口,确保要应用光照贴图的任何网格都具有适当的UV用于光照贴图。最简单的方法是打开“ Mesh import settings ”导入设置并启用“ Generate Lightmap UVs ”设置。
接下来,要控制光照贴图的分辨率,请前往 Lightmapping Settings 部分并调整 Lightmap Resolution 值。

  • 具有 Mesh Renderer 或 Terrain 组件
  • 标记为 Contribute GI
  • 使用内置的 Unity 材质、标准着色器 (Standard Shader) 或具有 Meta Pass 的着色器

要为场景生成光照贴图,请执行以下操作:

  • 打开Lighting window (菜单: Window > Rendering > Lighting)
  • 在“Lighting ”窗口的“Scene ”选项卡底部,选择“Generate Lighting”(或确保启用了“ Auto
    Generate”)。
  • Unity编辑器的状态栏右下角会出现一个进度条。

四、渲染纹理

渲染纹理是一种 Unity 在运行时创建和更新的纹理。要使用渲染纹理,请使用 Assets > Create > Render Texture 创建一个新的渲染纹理,并将其分配给 Camera 组件中的 Target Texture。然后,即可像使用常规纹理一样在 材质 中使用渲染纹理。

属性

Render Texture Inspector 与 Texture Inspector 几乎相同。
在这里插入图片描述

渲染纹理检查器实时显示渲染纹理的当前内容,对于使用渲染纹理的效果来说,它是一个非常宝贵的调试工具。

在这里插入图片描述
在这里插入图片描述

示例

在游戏中创建实时竞技场摄像机:

  1. 使用 Assets > Create > Render Texture 创建新的渲染纹理资源。
  2. 使用 GameObject > Camera 创建新的摄像机。
  3. 将渲染纹理分配给新摄像机的 Target Texture 。
  4. 选择 GameObject > 3D Object > Cube 来创建新的 3D 立方体。
  5. 将渲染纹理拖动到立方体上以创建使用该渲染纹理的材质。
  6. 进入运行模式 (Play Mode),观察立方体的纹理是否会根据新摄像机的输出情况实时更新。

在这里插入图片描述

五、立方体贴图

立方体贴图 是六个正方形纹理的集合, 这些纹理代表环境中的反射。六个正方形组成一个包围着对象的虚构立方体的各面; 每个面代表沿世界轴方向(向上、向下、向左、向右、 向前和向后)的视图。

立方体贴图常用于捕获对象的反射或“周围环境”;例如 天空盒和环境反射通常使用立方体贴图。
在这里插入图片描述

从纹理创建立方体贴图

创建立方体贴图的最快方法是从专门布局的纹理导入它们。 在 Project 窗口中选择纹理,从而在 Inspector 窗口中查看 Import Settings。在 Import Settings 中,将 Texture Type 设置为 Default 、 Normal Map 或 Single Channel ,并将 Texture Shape 设置为 Cube 。然后,Unity 自动将纹理设置为立方体贴图。
在这里插入图片描述
系统支持几种常用的立方体贴图布局(在大多数情况下,Unity 会自动检测到它们)。

支持垂直和水平交叉布局以及立方体贴图面的列和行:
在这里插入图片描述
另一种常见布局是 LatLong(纬度/经度,有时称为圆柱形)。全景图像 常采用此布局:
在这里插入图片描述

还可以找到 SphereMap(球形环境贴图)图像:
在这里插入图片描述
默认情况下,Unity 会查看导入纹理的宽高比以确定上述布局中最合适的 布局。导入时,会生成一个立方体贴图,可将其用于天空盒和反射:
在这里插入图片描述
Glossy Reflection 选项可用于立方体贴图纹理,而这些纹理将由 反射探针使用。该模式以特殊方式(镜面卷积)处理 立方体贴图 Mip 级别,然后可用于模拟不同平滑度表面的反射:

在这里插入图片描述
旧版立方体贴图资源
Unity 还支持从六个单独的纹理创建立方体贴图。 从菜单中选择 Assets > Create > Legacy > Cubemap , 然后将六个纹理拖入检视面板中的空字段内。
在这里插入图片描述

在这里插入图片描述
其他技巧
另一种有用的技巧是使用脚本从 Unity 场景的内容生成立方体贴图。 Camera.RenderToCubemap 函数可从场景中的 任何所需位置记录六个面图像;该函数的脚本参考页面上的代码示例 添加了一条菜单命令来简化此任务。

六、稀疏纹理

稀疏纹理 (Sparse Textures) (也称为“区块纹理”或“超级纹理”)是太大而无法完全存入显存的纹理。为了处理它们,Unity 将主纹理分解为更小的矩形部分,称为“区块”(tile)。然后,可根据需要加载各个区块。例如,如果摄像机只能看到稀疏纹理的一小块区域,那么只有当前可见的区块需要加载到内存中。

除了区块特性之外,稀疏纹理的行为与目前所用的任何其他纹理相似。无需进行特殊修改,着色器即可使用它们,而且它们可以有 Mipmap,使用所有纹理过滤模式等。如果由于某种原因无法加载特定的区块,则结果是不明的:有些 GPU 在缺少区块的位置显示黑色区域,但此行为未标准化。

并非所有硬件和平台都支持稀疏纹理。例如,在 DirectX 系统上,它们需要 DX11.2 (Windows 8.1) 以及相当新的 GPU。在 OpenGL 上,它们需要 ARB_sparse_texture 扩展支持。稀疏纹理仅支持非压缩纹理格式。
在这里插入图片描述


👉壁纸分享

在这里插入图片描述

总结

基于团结引擎还有很多新功能,在这里只是简单介绍下主要工作中比较常用的技术。
如能帮助到你,就帮忙点个赞吧,三连更好哦,谢谢
你的点赞就是对博主的支持,有问题记得留言评论哦!
不定时更新Unity开发技巧,觉得有用记得一键三连哦。么么哒

要使用OpenGL绘制金字塔并进行缩放、光照纹理,可以按照以下步骤进行: 1. 定义金字塔的顶点坐标和法向量,并将它们存储在顶点缓冲区中。 2. 使用OpenGL的透视投影矩阵将3D场景投影到2D屏幕上,可以使用gluPerspective函数来实现。 3. 使用glMatrixMode函数将矩阵模式设置为GL_MODELVIEW,然后使用glLoadIdentity函数将当前矩阵重置为单位矩阵。 4. 使用glTranslatef函数将金字塔移动到屏幕中心位置。 5. 使用glRotatef函数对金字塔进行旋转,可以通过修改旋转角度和轴向来实现不同的旋转效果。 6. 使用glScalef函数对金字塔进行缩放,可以通过修改缩放因子来实现不同的缩放效果。 7. 使用glEnable(GL_LIGHTING)函数启用光照,并使用glShadeModel(GL_SMOOTH)函数设置光照模式为平滑模式。 8. 使用glEnable(GL_LIGHT0)函数启用光源0,并设置光源0的位置和颜色。 9. 在渲染循环中,使用glClear函数清空屏幕,并使用glBindTexture函数绑定纹理,然后使用glDrawArrays函数绘制金字塔。 以下是一个简单的OpenGL程序示例,用于绘制一个带有缩放、光照纹理的金字塔: ```C++ #include <GL/glut.h> #include <SOIL/SOIL.h> GLuint texture; GLfloat angle = 0.0; GLfloat scale = 1.0; void display() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluPerspective(60, 1, 0.1, 100); glTranslatef(0, 0, -5); glRotatef(angle, 0, 1, 0); glScalef(scale, scale, scale); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); GLfloat light_position[] = { -1.0, 1.0, -1.0, 0.0 }; GLfloat light_color[] = { 1.0, 1.0, 1.0, 1.0 }; glLightfv(GL_LIGHT0, GL_POSITION, light_position); glLightfv(GL_LIGHT0, GL_DIFFUSE, light_color); glBindTexture(GL_TEXTURE_2D, texture); glBegin(GL_TRIANGLES); // 绘制金字塔 glEnd(); glFlush(); } void init() { // 加载纹理 texture = SOIL_load_OGL_texture("texture.png", SOIL_LOAD_AUTO, SOIL_CREATE_NEW_ID, SOIL_FLAG_INVERT_Y); glBindTexture(GL_TEXTURE_2D, texture); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); } void idle() { angle += 0.5; if (angle > 360) angle -= 360; scale += 0.01; if (scale > 1.5) scale = 1.0; glutPostRedisplay(); } int main(int argc, char * argv[]) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(400, 400); glutCreateWindow("Pyramid"); glutDisplayFunc(display); glutIdleFunc(idle); init(); glutMainLoop(); return 0; } ``` 在上面的示例中,我们使用gluPerspective函数设置透视投影矩阵,glTranslatef函数将金字塔移动到屏幕中心位置,glRotatef函数对金字塔进行旋转,glScalef函数对金字塔进行缩放。在渲染循环中,我们使用glClear函数清空屏幕,并使用glBindTexture函数绑定纹理,然后使用glDrawArrays函数绘制金字塔。我们还使用glEnable(GL_LIGHTING)函数启用光照,使用glEnable(GL_LIGHT0)函数启用光源0,并设置光源0的位置和颜色。在idle函数中,我们修改旋转角度和缩放因子,以实现动态效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熬夜敲代码的小N

你的鼓励是对我最大的支持,么么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值