Unity3D

A collection of 1256 posts
Unity3D:使用 PIX 来调试 DirectX 12 着色器
Unity3D

Unity3D:使用 PIX 来调试 DirectX 12 着色器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 使用 PIX 来调试 DirectX 12 着色器 PIX 是 Microsoft 为 Windows 开发人员提供的性能调优和调试工具。此工具提供了一系列用于分析应用程序性能的模式,并包括从应用程序中捕获 DirectX 项目的帧以进行调试的功能。 使用 PIX 可调查 Windows 64位 (x86_64) 独立平台或通用 Windows 平台应用程序中的问题。 要安装 PIX,请下载并运行 Microsoft PIX 安装程序,按照说明进行操作。 有关 PIX 的更多信息,请参阅 Microsoft 的 PIX 说明 (Introduction) 和 PIX 文档 (Documentation)
5 min read
Unity3D

Unity3D:使用 Visual Studio 调试着色器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 使用 Visual Studio 调试着色器 在使用 DirectX 11 或 12 的 Windows 平台上,可以使用 Visual Studio 调试 Unity 应用程序中的着色器。本页面包含有关如何执行此操作的信息。 注意:如果使用的是 DirectX 12,Microsoft 建议使用 PIX 而不是 Visual Studio 来调试着色器。有关在 Windows 上对 Unity 使用 PIX 的信息,请参阅使用 PIX 调试着色器。 准备着色器 要调试着色器,必须包含调试符号进行编译。为此,需要在每个要调试的着色器的源代码中插入 #pragma
2 min read
Unity3D

Unity3D:优化着色器运行时性能

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 优化着色器运行时性能 不同的平台具有截然不同的性能;与低端移动端 GPU 相比,高端 PC GPU 在图形和着色器方面的处理能力要高得多。即使在单一平台上也是如此;快速的 GPU 比慢速的集成 GPU 快几十倍。 移动平台和低端 PC 上的 GPU 性能可能远低于开发计算机上的性能。建议您手动优化着色器以减少计算和纹理读取,以便在低端 GPU 计算机上获得良好的性能。例如,某些内置着色器对象具有“移动”等效项,这些等效项要快得多,但有一些限制或近似值。 本页包含有关优化着色器以提高运行时性能的信息。 仅执行所需的计算 着色器代码需要执行的计算和处理越多,它对游戏性能的影响就越大。例如,支持每种材质的颜色可以使着色器更加灵活,但如果始终将该颜色设置为白色,则会对屏幕上渲染的每个顶点或像素执行无用的计算。 计算的频率也会影响游戏的性能。通常,与顶点数(顶点着色器执行次数)相比,渲染的像素数会更多(因此像素着色器执行次数也更多),而渲染的顶点数比渲染的对象更多。
5 min read
Unity3D

Unity3D:为不同的图形 API 编写着色器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 为不同的图形 API 编写着色器 在某些情况下,不同图形 API 之间的图形渲染行为方式存在差异。大多数情况下,Unity 编辑器会隐藏这些差异,但在某些情况下,编辑器无法为您执行此操作。下面列出了这些情况以及发生这些情况时需要采取的操作。 渲染纹理坐标 垂直纹理坐标约定在两种类型的平台之间有所不同,分别是 Direct3D 类和 OpenGL 类平台。 * Direct3D 类:顶部坐标为 0 并向下增加。此类型适用于 Direct3D、Metal 和游戏主机。 * OpenGL 类:底部坐标为 0 并向上增加。此类适用于 OpenGL 和 OpenGL ES。 除了渲染到渲染纹理的情况下,这种差异不会对您的项目产生任何影响。在 Direct3D 类平台上渲染到纹理时,Unity 会在内部上下翻转渲染。
11 min read
Unity3D:支持 DX11/OpenGL Core 曲面细分的表面着色器
Unity3D

Unity3D:支持 DX11/OpenGL Core 曲面细分的表面着色器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 支持 DX11/OpenGL Core 曲面细分的表面着色器 在内置渲染管线中,表面着色器在一定程度上支持 DirectX 11/OpenGL Core GPU 曲面细分。 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 概述 * 曲面细分由 tessellate:FunctionName 修改器声明。该函数计算三角形的边和内部曲面细分因子。 * 使用曲面细分时,对于域着色器中的每个生成的顶点,
9 min read
Unity3D

Unity3D:表面着色器光照示例

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 表面着色器光照示例 本页提供了表面着色器中的自定义表面着色器光照模型的示例。要进一步了解常规表面着色器指南,请参阅表面着色器示例。 因为__延迟光照__与一些自定义的每材质光照模型不兼容,所以下面的大多数示例都使着色器仅编译到__前向渲染__。 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 Diffuse 以下是使用内置兰伯特光照模型的着色器示例: Shader "Example/Diffuse Texture" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader
6 min read
Unity3D

Unity3D:表面着色器中的自定义光照模型

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 表面着色器中的自定义光照模型 在内置渲染管线中,当编写表面着色器时,将描述表面的属性(如反照率颜色和法线),而由__光照模型__计算光照交互。 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 概述 有两个内置光照模型,分别是 Lambert 和 BlinnPhong,前者用于漫射光照,后者用于镜面反射光照。Unity 中的 Lighting.cginc 文件用于定义这些模型(
3 min read
Unity3D:表面着色器示例
Unity3D

Unity3D:表面着色器示例

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 表面着色器示例 本页上的表面着色器示例说明了如何使用内置光照模型。如需查看如何实现自定义光照模型的示例,请参阅表面着色器光照示例。 在内置渲染管线中,表面着色器是编写与光照交互的着色器的一种简化方式。 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 简单的着色器示例 我们将从一个非常简单的着色器 (Shader) 开始,并在此基础上加以丰富。下面的着色器将表面颜色设置为“白色”。它使用内置的兰伯特(漫射)光照模型。 Shader "Example/Diffuse Simple" { SubShader
12 min read
Unity3D

Unity3D:渲染管线兼容性

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 渲染路径 * 在前向渲染中,将使用 ForwardBase 和 ForwardAdd 通道。 * 在延迟着色中,将使用 Deferred 通道。 * 在旧版延迟光照中,将使用 PrepassBase 和 PrepassFinal 通道。 * 在旧版顶点光照中,将使用 Vertex、VertexLMRGBM
3 min read
Unity3D

Unity3D:编写表面着色器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 编写表面着色器 在内置渲染管线中,表面着色器是一种编写与光照交互的着色器的简化方法。 渲染管线兼容性 功能名称内置渲染管线通用渲染管线 (URP)高清渲染管线 (HDRP)自定义 SRP表面着色器是否 有关在 URP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 有关在 HDRP 中创建 Shader 对象的简化方法,请参阅 Shader Graph。否 概述 编写与光照交互的着色器非常复杂。有不同的光源类型,不同的阴影选项,不同的渲染路径(前向和延迟渲染);着色器应该以某种方式应对所有这些复杂性。 表面着色器是一种代码生成方法,与使用低级顶点/像素着色器程序相比,可以更轻松地编写光照着色器。 如需了解示例,请查看表面着色器示例和表面着色器自定义光照示例。 工作原理 您可以定义一个“表面函数”,它将您需要的所有 UV
11 min read
Unity3D

Unity3D:Unity 中的 GLSL

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 Unity 中的 GLSL 除了编写 HLSL 着色器程序,还可以在 Unity 中编写原始 OpenGL 着色语言 (GLSL) 着色器程序。 注意:在常规工作流程中,不建议或不需要这样做;Unity 会在需要时将您的 HLSL 交叉编译为优化的 GLSL。仅建议将原始 GLSL 用于测试或支持使用 GLSL 的平台上的项目。 GLSL 代码片段 在 GLSLPROGRAM 和 ENDGLSL 关键字之间编写 GLSL 程序代码片段。 在 GLSL 中,所有着色器函数入口点都必须名为 main()。Unity 加载 GLSL 着色器时,会为顶点程序加载一次源代码(使用
2 min read
Unity3D

Unity3D:使用采样器状态

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 使用采样器状态 耦合的纹理和采样器 大多数情况下,在着色器中对纹理进行采样时,纹理采样状态应来自纹理设置 - 本质上,纹理和采样器耦合在一起。这是使用 DX9 样式着色器语法时的默认行为: sampler2D _MainTex; // ... half4 color = tex2D(_MainTex, uv); 使用 HLSL 关键字 sampler2D、sampler3D 和 samplerCUBE 可声明纹理和采样器。 大部分情况下,这是您想要的结果,而且在较旧的图形 API (OpenGL ES) 中,这是唯一受支持的选项。 单独的纹理和采样器 许多图形 API 和 GPU 允许使用比纹理更少的采样器,并且耦合的纹理 + 采样器语法可能不允许编写更复杂的着色器。例如,Direct3D 11 允许在单个着色器中使用最多
4 min read
Unity3D

Unity3D:着色器数据类型和精度

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 着色器数据类型和精度 Unity 中的标准着色器语言为 HLSL,支持一般 HLSL 数据类型。但是,Unity 对 HLSL 类型有一些补充,特别是为了在移动平台上提供更好的支持。 基本数据类型 着色器中的大多数计算是对浮点数(在 C# 等常规编程语言中为 float)进行的。浮点类型有几种变体:float、half 和 fixed(以及它们的矢量/矩阵变体,比如 half3 和 float4x4)。这些类型的精度不同(因此性能或功耗也不同): 高精度:float 最高精度浮点值;一般是 32 位(就像常规编程语言中的 float)。 完整的 float 精度通常用于世界空间位置、纹理坐标或涉及复杂函数(如三角函数或幂/
6 min read
Unity3D

Unity3D:内置着色器变量

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 内置着色器变量 Unity 的内置文件包含着色器的全局变量:当前对象的变换矩阵、光源参数、当前时间等等。就像任何其他变量一样,可在着色器程序中使用这些变量,但如果已经包含相关的 include 文件,则不必声明这些变量。 有关 include 文件更多信息,请参阅内置 include 文件。 变换 所有这些矩阵都是 float4x4 类型,并且是列主序的。 名称值UNITY_MATRIX_MVP当前模型 * 视图 * 投影矩阵。UNITY_MATRIX_MV当前模型 * 视图矩阵。UNITY_MATRIX_V当前视图矩阵。UNITY_MATRIX_P当前投影矩阵。UNITY_MATRIX_VP当前视图 * 投影矩阵。UNITY_MATRIX_T_MV模型转置
6 min read
Unity3D

Unity3D:内置着色器 helper 函数

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 内置着色器 helper 函数 Unity 具有许多内置实用函数,旨在使编写着色器更简单,更轻松。 UnityCG.cginc 中声明的函数 请参阅内置着色器 include 文件来大致了解 Unity 随附的着色器 include 文件。 UnityCG.cginc 中的顶点变换函数 功能:描述:float4 UnityObjectToClipPos(float3 pos)将对象空间中的点变换到齐次坐标中的摄像机裁剪空间。这等效于 mul(UNITY_MATRIX_MVP, float4(pos, 1.0)),应该在适当的位置使用。float3 UnityObjectToViewPos(float3 pos)将对象空间中的点变换到视图空间。这等效于 __mul(UNITY_MATRIX_
3 min read
Unity3D

Unity3D:内置宏

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 内置宏 Unity 在编译着色器程序时会定义几个预处理器宏。 目标平台 宏:目标平台:SHADER_API_D3D11Direct3D 11SHADER_API_GLCORE桌面端 OpenGL“核心”(GL 3/4)SHADER_API_GLESOpenGL ES 2.0SHADER_API_GLES3OpenGL ES 3.0/3.1SHADER_API_METALiOS/Mac MetalSHADER_API_VULKANVulkanSHADER_API_D3D11_9X适用于通用 Windows 平台的 Direct3D 11“功能级别 9.x”
9 min read
Unity3D

Unity3D:内置着色器 include 文件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 内置着色器 include 文件 Unity 提供了若干文件供着色器程序用于引入预定义的变量和 helper 函数。这可以通过标准 #include 指令来完成,例如: CGPROGRAM // ... #include"UnityCG.cginc" // ... ENDCG Unity 中的着色器 include 文件采用 .cginc 扩展名,内置的着色器 include 文件包括: * HLSLSupport.cginc -_(自动包含)_用于跨平台着色器编译的 helper 宏和定义。 * UnityShaderVariables.cginc -_(自动包含)_常用的全局变量。 * UnityCG.cginc - 常用的 helper 函数。 * AutoLight.cginc -
2 min read
Unity3D

Unity3D:向顶点程序提供顶点数据

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 向顶点程序提供顶点数据 对于 Cg/HLSL 顶点程序, 网格顶点数据作为输入传递给顶点 着色器函数。每个输入都需要有指定的语义:例如,POSITION 输入表示顶点位置,NORMAL 表示顶点法线。 通常,顶点数据输入在结构中声明,而不是 逐个列出。在 UnityCG.cginc include 文件中 定义了几个常用的顶点结构,在大多数情况下, 仅使用它们就足够了。这些结构为: * appdata_base:位置、法线和一个纹理坐标。 * appdata_tan:位置、切线、法线和一个纹理坐标。 * appdata_full:位置、切线、法线、四个纹理坐标和颜色。 示例:以下着色器根据法线为网格着色,并使用 appdata_base
2 min read
Unity3D

Unity3D:使用 Cg/HLSL 访问着色器属性

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 使用 Cg/HLSL 访问着色器属性 着色器在 Properties 代码块中声明材质属性。如果要在着色器程序中访问其中一些属性,则需要声明具有相同名称和匹配类型的 Cg/HLSL 变量。 例如,以下着色器属性: _MyColor ("Some Color", Color) = (1,1,1,1) _MyVector ("Some Vector", Vector) = (0,0,0,0) _MyFloat ("My float", Float) = 0.5 _MyTexture ("Texture", 2D) = "white" {} _MyCubemap ("Cubemap", CUBE) = "" {} 可通过如下 Cg/HLSL
4 min read
Unity3D:着色器语义
Unity3D

Unity3D:着色器语义

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 着色器语义 编写 HLSL 着色器程序时, 输入和输出变量需要通过语义来表明 其“意图”。这是 HLSL 着色器语言中的 标准概念;请参阅 MSDN 上的语义 (Semantics) 文档以了解更多详细信息。 顶点着色器输入语义 主顶点着色器函数(由 #pragma vertex 指令表示)需要在所有输入参数上都有语义。 这些对应于各个网格数据元素,如顶点位置、法线网格和纹理坐标。 有关更多详细信息,请参阅顶点程序输入。 以下是一个简单的顶点着色器的示例,它采用顶点位置 和纹理坐标作为输入。像素着色器 将纹理坐标可视化为颜色。 Shader "Unlit/Show UVs" { SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag
9 min read
Unity3D

Unity3D:在 HLSL 中声明和使用着色器关键字

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 在 HLSL 中声明和使用着色器关键字 本页包含有关在 HLSL 代码中使用着色器关键字的信息。有关着色器关键字的一般介绍,请参阅着色器关键字。有关在着色器图中声明和使用着色器关键字的信息,请参阅关键字。 在 HLSL 代码中,使用指令声明着色器关键字,并使用指令指示着色器代码的一部分取决于着色器关键字的状态。可以在常规图形着色器(包括 Surface 着色器)和计算着色器中使用着色器关键字。#pragma#if 声明着色器关键字 若要声明着色器关键字,请在 HLSL 代码中使用以下指令之一:#pragma 命令描述#pragma multi_compile声明一组关键字。 默认情况下,这些关键字具有全局范围并影响所有着色器阶段。 构建过程包括此集中的所有关键字。#pragma shader_feature声明一组关键字,并指示编译器编译未启用这些关键字的变体。 默认情况下,这些关键字具有全局范围并影响所有着色器阶段。 生成过程包括此集中在生成时使用的关键字。 有关 和 之间的区
8 min read
Unity3D

Unity3D:面向 HLSL 中的图形 API 和平台

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 面向 HLSL 中的图形 API 和平台 某些 #pragma 指令采用允许您面向特定图形 API 和平台的参数。本页包含有关使用这些指令的信息,并提供有效参数值的列表。 包含或排除图形 API 默认情况下,Unity 会为当前构建目标列表中的每个图形 API 编译所有着色器程序。有时,您可能只想为某些图形 API 编译某些着色器程序;例如,如果您使用并非所有平台都支持的功能。 若要仅为给定 API 编译着色器程序,请使用该指令。您可以传递多个值,空格分隔。#pragma only_renderers 此示例演示如何仅为 Metal 和 Vulkan 编译着色器: #pragma only_renderers metal vulkan 若要从给定编译器的编译中排除着色器代码,请使用该指令。
2 min read
Unity3D

Unity3D:面向 HLSL 中的着色器模型和 GPU 功能

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 面向 HLSL 中的着色器模型和 GPU 功能 您可以使用#pragma指令来指示着色器需要某些 GPU 功能。在运行时,Unity 使用此信息来确定着色器程序是否与当前硬件兼容。 您可以使用指令指定单个 GPU 功能,也可以使用指令指定着色器模型。着色器模型是一组 GPU 功能的简写;在内部,它与具有相同功能列表的指令相同。#pragma require#pragma target#pragma require 正确描述着色器所需的 GPU 功能非常重要。如果着色器使用未包含在要求列表中的功能,则可能导致编译时错误,或者设备在运行时无法支持着色器。 默认行为 默认情况下,Unity 使用 编译着色器,对应于 。#pragma require derivatives#pragma target 2.5
7 min read
Unity3D

Unity3D:HLSL 中的杂注指令

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 HLSL 中的杂注指令 在 HLSL 中,指令是一种预处理器指令。它们向着色器编译器提供其他类型的预处理器指令未涵盖的其他信息。#pragma 使用 pragma 指令 可以将指令放在 HLSL 代码中的任何位置,但将它们放在开头是一种常见的约定,如下所示:#pragma #pragma target 3.0 #pragma exclude_renderers vulkan #pragma vertex vert #pragma fragment frag // The rest of your HLSL code goes here 限制 指令的使用存在一些限制:#pragma * 如果表达式仅依赖于以下条件 () 指令,则可以在条件 () 指令中使用指令:
7 min read
Unity3D

Unity3D:在 HLSL 中包含和include_with_pragmas指令

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 在 HLSL 中包含和include_with_pragmas指令 在 HLSL 中,指令是一种预处理器指令。它们指示编译器将一个 HLSL 文件的内容包含在另一个 HLSL 文件中。它们包含的文件称为包含文件。#include 在 Unity 中,常规指令的工作方式与标准 HLSL 中相同。有关常规指令的详细信息,请参阅 HLSL 文档:包含指令。#include#include Unity 还提供了特定于 Unity 的附加指令。该指令的工作方式与常规指令相同,但它也允许您在包含文件中使用指令。这意味着该指令允许您在多个文件之间共享指令。#include_with_pragmas#include_with_pragmas#include#pragma#include_with_
2 min read
NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号