- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
计算着色器
计算着色器 (Compute Shaders) 是在普通渲染管道外的图形卡上运行的程序。可用于大规模并行通用图形处理器 (GPGPU) 算法,或提高部分游戏渲染速度。要高效利用这些着色器,需要对 GPU 架构和并行算法有深入了解;并对 DirectCompute、OpenCL 或 CUDA 有一定了解。
Unity 中的计算着色器是基于 DirectX 11 DirectCompute 技术构建而成;并且目前需要 Windows Vista 或更高版本的系统,以及支持 Shader Model 5.0 的 GPU。
计算着色器资源
计算着色器与普通着色器类似,是工程中含 *.compute
文件扩展名的资源文件。使用 DirectX 11 样式的 HLSL 语言编写而成,含有最少数量的 #pragma
编译指令,可指示将哪个函数编译为计算着色器内核。
以下是一个最小的计算着色器文件示例:
// test.compute #pragma kernel FillWithRed RWTexture2D<float4> res; [numthreads(1,1,1)] void FillWithRed (uint3 dtid :SV_DispatchThreadID) { res[dtid.xy] = float4(1,0,0,1); }
上述示例未以远程方式执行任何有趣的操作,只是使用红色填充输出纹理。
此示例使用标准的 DX11 HLSL 语言,#pragma kernel FillWithRed
除外。一个计算着色器资源文件必须至少包含一个可调用的“计算内核”,并且此函数由 #pragma 指令指示。文件中可有多个内核;只需添加多行 #pragma kernel
。
编译此内核时,#pragma kernel
行后面可跟着一系列待定义的预处理器宏,例如:
#pragma kernel KernelOne SOME_DEFINE DEFINE_WITH_VALUE=1337 #pragma kernel KernelTwo OTHER_DEFINE // ...
调用计算着色器
在脚本中,定义ComputeShader
类型的变量,将引用分配至此资源,然后使用 ComputeShader.Dispatch 函数调用这些着色器。有关更多详细信息,请参阅 ComputeShader 类的脚本组件手册。
ComputeBuffer 类与计算着色器紧密相关,可定义任意数据缓冲区(用 DX11 的专业术语表示为“结构缓冲区”)。如果渲染纹理 (Render Textures) 拥有“随意访问”标志设置(DX11 中的“无序访问视图”),也可使用计算着色器编写渲染纹理,请参阅 RenderTexture.enableRandomWrite。
计算着色器中的纹理采样器
纹理和采样器在 Unity 中不是独立的对象,要在计算着色器中使用这两者,必须遵守一些 Unity 的特定规则:
- 使用与纹理名称相同的名称,以 "sampler" 开头(例如
Texture2D MyTex; SamplerState samplerMyTex
)。在这种情况下,程序会将采样器初始化为纹理的过滤/循环/各向异性设置。 - 或使用一个“预定义”采样器;名称必须包含“线性 (Linear)” 或“点 (Point)”(适用于过滤模式)和“强制拉伸 (Clamp)” 或“重复 (Repeat)”(适用于循环模式)。例如,
"SamplerState MyLinearClampSampler"
- 这将包含线性过滤和强制拉伸循环模式。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论