1、什么是Shader

2023-11-08

什么是Shader

Shader,中文名为着色器。

Shader其实就是专门用来渲染图形的一种技术,通过shader,我们可以自定义显卡渲染画面的算法,使画面达到我们想要的效果。小到每一个像素点,大到整个屏幕。

Shader分为两类 :

  • 顶点Shader
    3D图形都是由一个个三角面片组成的,顶点Shader就是计算每个三角面片上的顶点,并为最终像素渲染做准备。
  • 像素(片段)Shader
    顾名思义,就是以像素为单位,计算光照、颜色的一系列算法。 几个不同的图形API都有各自的Shader语言,在DirectX中,顶点shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader; 在OpenGL中,顶点Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我们常说的片段Shader或者片元Shader。
    说白了,Shader其实就是一段代码,这段代码的作用是告诉GPU具体怎样去绘制模型的每一个顶点的颜色以及最终每一个像素点的颜色。
  • Shader编程语言
    既然Shader是一段代码,那必然要用一种语言来书写它,目前主流的有三种语言:
    基于OpenGL的OpenGL Shading Language,简称GLSL。
    基于DirectX的High Level Shading Language,简称HLSL。
    还有NVIDIA公司的C for Graphic,简称Cg语言。
    GLSL与HLSL分别是基于OpenGL和Direct3D的接口,两者不能混用。而Cg语言是用于图形的C语言,这其实说明了当时设计人员的一个初衷,就是让基于图形硬件的编程变得和C语言编程一样方便,自由。正如C++和 Java的语法是基于C的,Cg语言本身也是基于C语言的。如果您使用过C、C++、Java其中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等。
    Cg语言是Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。
    美术人员看到这里时也不用害怕,语法上并不难,而且在后续的章节中碰到相关的语法时我们会详细的进行说明。

什么是Unity Shader

显卡有NVIDIA、ATI、Intel等等。。。
图形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。。。
Shader编程语言有GLSL、HLSL、Cg等等。。。
是不是有点头晕,该怎么去选择呢?在Unity中我们又应该如何做呢?
其实在Unity中反而一切变的简单起来了,我们只需关心如何去这实现我们想要的效果就好了,其余的事情全部交给Unity来自动处理。因为我们在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着色器语言,那么我们在Unity中应该用什么语言来书写Shader呢?
官方的建议是用Cg/HLSL来编写,当然你也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。
对于Unity新的渲染管线URP(最早名称是LWRP)、HDRP默认全部才用HLSL编写,同时也支持Cg编写。
Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称为ShaderLab。

  • 在Unity中有3种Shader(其实就是三种不同的写法):
    Surface Shaders 表面着色器
    Vertex/Fragment Shaders 顶点/片断着色器
    Fixed Function Shaders 固定管线着色器
    其中Fixed Function Shaders已经被淘汰,完全没有学习的必要了。
    Surface Shader其实就是Unity对Vertex/Fragment Shader的又一层包装,以使Shader的制作方式更符合人类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。
    Unity新的渲染管线URP也抛弃了Surface Shaders。只支持Vertex/Fragment Shader.
    对于新入门的同学只学习Vertex/Fragment Shaders就可以了。
    从性能上将,Surface shaders也性能低很多。
    另外,学会Shader也会给我们带来很多的好处:
    游戏中模型显示粉色的情况你一定碰到过吧,是Shader丢失呢,还是Shader不符合当前平台呢,又或者是Shader上有语法的错误呢?如果我们有了解并学会Shader的话,这些问题就不会再是一脸懵逼啦。
    內建Unity Shader仅仅只是“通用”用例,不足以满足我们所有的画面表现需求。
    一旦掌握Shader,可以为游戏/应用创造独一无二的视觉享受。根据实际需求,为游戏和应用实现特定功能的Shader。
    能大大的帮助我们做渲染上的性能优化,因为通过Shader可以控制渲染什么以及如何渲染。
    撰写Shader的能力对于游戏团队非常重要,掌握Shader技能的开发一直是炙手可热的职位。现在一个不争的事实就是,技术美术永远是各大厂商的稀缺资源。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1、什么是Shader 的相关文章

  • QML 将纹理应用于网格

    我正在尝试将图像纹理应用到 QML Qt 5 6 2 中的网格 我从示例 Shadow Map QML 开始 我想对 GroundPlane 进行纹理处理 材质和效果 qml 类应用于该 GroundPlane 网格 但我看不到如何应用图像
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • U3D游戏开发中摇杆的制作(NGUI版)

    在PC端模拟摇杆 实现控制摇杆让玩家或者物体移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine public clas
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 着色器使立方体的边缘倾斜?

    这个问题涉及使用着色器 可能在 Unity3D 环境中 但 Metal 或 OpenGL 都可以 以在网格最小立方体上实现圆角边缘 我希望只使用 12 个三角形的简约网格立方体 然后通过着色器 使每个块的边缘 角 稍微倾斜 其实这样可以吗带
  • 使用GL着色器语言的相机帧yuv到rgb转换

    我从字节数组中的 android 相机预览回调获取相机帧并将其传递给 jni 代码 由于我们不能在 C 中使用字节 因此我将其转换为整数数组 如下所示 JNIEXPORT void JNICALL Java com omobio armad
  • 是否可以在Unity的HDRP中创建DepthMask效果?

    我已经为此努力了一段时间 但我不知道是否有可能创建一个深度掩模着色器HDRP 如此处所述 http wiki unity3d com index php DepthMask 对于我的确切用途 我试图在应用了材质的任何形状上创建一个 洞 以显
  • Unity3D - 用于精灵裁剪的着色器

    我正在尝试创建一个可用于在游戏中剪辑 2D 精灵的着色器 我在中找到了该着色器另一个问题 https stackoverflow com questions 16397023 unity3d a shader that will clip
  • 处理中点/笔划的景深着色器

    最近我一直在使用下面的景深着色器 最初来自ofx后处理 https github com neilmendoza ofxPostProcessing blob master src DofPass cppOpenFrameworks 库 用
  • OpenGL Phong 光照:镜面高光错误

    我的 OpenGL 中的 Phong 光照着色器似乎有一个奇怪的问题 镜面高光出现在对象的错误一侧 手头的问题 正如您所看到的 镜面高光出现在立方体的另一侧 从灯光的角度来看 也出现在立方体垂直边缘的角上 它应该只出现在最靠近灯光的一侧 立
  • WPF 着色器效果 - 抗锯齿不显示

    我遇到一个问题 我有一个 WPF 着色器效果 由 Rene Schulte 修改 来模拟点阵显示 DMD 一切都很好 但所有的点都是别名的 See attached image 我尝试了WPF中的许多功能 以带来抗锯齿 但无济于事 在构造函
  • 为什么我不能使用uniform1f而不是uniform4f来设置vec4制服?

    我通过以下方式逐步学习WebGL这本书 https sites google com site webglbook 我尝试通过使用缓冲区来绘制三个点 gl ARRAY BUFFER 而不是循环 正如我之前在本书的其他示例中所做的那样 var
  • 在Unity中如何使两个精灵的重叠区域透明?

    在Unity中如何使两个精灵的重叠区域透明 你能写一个关于它的着色器吗 经过一些研究 我了解到我应该使用模板缓冲区 但我不知道如何使用 这对我来说至关重要 我必须在 6 天内完成这个学校项目 请帮忙 示例图片 就这样 请记住这是我第一次使用
  • 使用着色器创建模糊过滤器 - 从片段着色器访问相邻像素?

    我想使用 OpenGL ES 2 0 中的片段着色器创建模糊效果 我感兴趣的算法只是一个平均模糊 将所有相邻像素添加到我自己中并除以 9 进行标准化 但是我有两个问题 1 这是否需要我首先渲染到帧缓冲区 然后切换渲染目标 或者有更简单的方法
  • Unity 后处理 PostProcessEffectRenderer 在编辑器中显示,但在构建中不显示

    将 PostProcessEffectRenderer 的实现添加到 Unity 后处理堆栈后 效果在 Unity 编辑器中完美运行 但不会在构建的游戏中显示 对构建质量的更改没有效果 使用针对 Windows x86 64 构建的最高质量
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更
  • LibGDX - 着色器适用于桌面但不适用于 Android

    我编写了一个简单的程序 可以在 3D 环境中渲染球体 并根据球体周围的四个光源为其着色 当我在桌面上运行该程序时 它工作得很好 但在 Android 设备上 球体只是纯色的 下面是一些图片来说明我正在谈论的内容 gt Desktop gt
  • 使用 gl_FragColor 与 vec4 颜色?

    似乎有很多不明确的地方gl FragColor被弃用 例如 它缺失在GLSL 4 40 规范 https www khronos org registry OpenGL specs gl GLSLangSpec 4 40 pdf 但它包含在
  • Shader的功能参数表现

    我试图了解如何在着色器语言中实现传递参数 我读过几篇文章和文档 但仍然有一些疑问 特别是我试图理解与C 函数调用 特别强调性能 之间略有差异HLSL Cg and GLSL但我猜下划线的实现非常相似 到目前为止我所理解的 除非另有说明 函数

随机推荐

  • Ansible脚本搭建k8s平台

    1 官网下载安装virtualBox centos7镜像 2 virtualBox安装centos7镜像 参考http www cnblogs com hihtml5 p 8217062 html 3 下载安装putty通过SSH连接虚拟机
  • Linux 进程基础概念-进程状态、进程构成、进程控制

    目录 Linux 进程 进程基础概念 进程状态 进程的构成 进程控制 进程创建和终止 Linux 进程 参考 linux操作系统 进程的切换与控制 到底有啥关系 知乎 zhihu com Linux进程解析 deep explore的博客
  • 【代码】处理数据集的一些常用脚本

    前言 由于训练模型经常使用到一些处理数据集的脚本 每次重新写都蛮麻烦的 因此决定整理一下之后备用 加快效率 一些是借鉴网上的脚本但是因为时间太久找不到原链接所以比较抱歉没有贴出来原链接 还有一些是自己写的 发出来分享一下 1 voc数据集抽
  • wifi卡慢延迟高_wifi卡怎么办(wifi信号满格但网速慢解决方法)

    最近学霸君有个朋友 天天吹自己家里 100M 光纤 可每晚一起开黑王者的总是说家里 WiFi 莫名卡顿 断流 然后各种理由坑人 让它换路由器吧 又不舍得花这点钱 说是够用就行 生怕自己气成祖安人的学霸君 只好上门帮他看看是不是路由器没设置好
  • [技术发展-26]:新型信息与通信网络的数据安全

    前言 网络安全 通常指计算机网络的安全 实际上也可以指计算机通信网络的安全 计算机通信网络是将若干台具有独立功能的计算机通过通信设备及传输媒体互连起来 在通信软件的支持下 实现计算机间的信息传输与交换的系统 而计算机网络是指以共享资源为目的
  • 【idea插件开发】从0入门idea插件开发,idea插件开发教程,如何开发idea插件

    idea插件介绍 作为一枚程序员 平时最常用的ide就是IntelliJ IDEA 平时会用到各种各样的插件 通过插件的使用 提高自己的开发效率 idea具有全局性 安装好插件后 对idea生效 所有的工程均能找到 idea使用的便捷性 在
  • 单词长度(输入在一行中给出一行文本,以‘.’结束,结尾的句号不能计算在最后一个单词的长度内。在一行中输出这行文本对应的单词的长度,每个长度之间以空格隔开,行末没有最后的空格。)

    单词长度 5分 题目内容 你的程序要读入一行文本 其中以空格分隔为若干个单词 以 结束 你要输出这行文本中每个单词的长度 这里的单词与语言无关 可以包括各种符号 比如 it s 算一个单词 长度为4 注意 行中可能出现连续的空格 输入格式
  • OpenWRT的开发

    Openwrt 官方正式的发行版是已编译好了的映像文件 后缀名bin或trx trx2 此映像文件可从Openwrt官方网站的下载页面中轻松获取到 连接地址为 OpenWrt官方网站 准备工作 在开始编译Openwrt之前需要您做些准备工作
  • FreeRTOS+CubeMX系列第一篇——初识FreeRTOS

    文章目录 一 关于FreeRTOS 二 FreeRTOS的特点 三 如何在CubeMX上配置FreeRTOS 四 FreeRTOS文档资料 五 同系列博客 一 关于FreeRTOS 1 什么是FreeRTOS FreeRTOS是一个迷你的实
  • goland os.Open 路径错误

    os Open 报错原因 Open不是当前目录下查找 项目取的是项目根目录 不是执行目录 证明如下 exPath os Getwd fmt Println expath exPath file err os Open exPath file
  • 504 错误码排查

    当出现 504 错误码时 表示请求超时 服务器无法及时响应请求 需要检查下应用是否有什么耗时的操作 比如是否出现了 SQL 慢查询 是否接口发生死循环 是否出现死锁等 同时需要关注服务器系统负载高不高 网络异常 接口原本好好的 突然出现超时
  • JAVA基础算法——将字符串按照字典倒序排序并输出

    JAVA基础算法 将字符串按照字典倒序输出 作者 飞不高的鱼 转载请注明出处 import java util Arrays import java util Comparator 将已知的乱序字符串按照字典倒序排序输出 author xi
  • 矩阵的投影、线性拟合与最小二乘法

    概要 投影矩阵 如果一个b向量进行矩阵运算 Pb 那么向量b就会投影要A的列空间的最近点 目录 一 矩阵的四大基础子空间 二 投影矩阵 三 最小二乘法 一 矩阵的四大基础子空间 一个矩阵有4个子空间 分别是行空间 零空间 列空间和左零空间
  • C#中的委托、事件与接口

    C 中的委托 事件与接口 一 委托 一 委托链 二 匿名函数 三 Lamda语句 二 事件 三 接口 一 委托 委托 将方法以变量的形式传递 以方法的形式执行 注意 赋值方法的返回类型 参数要与委托的一致 如委托定义的参数类型是string
  • 微信小程序上传文件组件

    微信小程序上传文件 一 说明 该拍照组件带有微信授权相机功能 会结合后端接口 将上传的图片以数组集合的形式传值给父级页面 注意 组件适用于 单独上传图片 不携带参数 结合后端接口返回路径之后 再调用另外的保存接口 携带参数与图片提交的场景
  • 抓取第三方网站数据

    最近需要把某网站的统计数据聚合到我们自己的系统里 但是该网站没有提供标准API 所以就尝试自己抓取了一下 本文总结一下一般的方法 分析服务地址 通常网站有2种做法 一种是后端渲染 直接把渲染后的完整界面呈现在浏览器 另一种前端是静态页面 通
  • mybatis plus中的${ew.sqlSegment},${ew.sqlSelect},${ew.customSqlSegment},${ew.sqlSet}使用

    ew是mapper方法里的 Param Constants WRAPPER Wrapper queryWrapper对象 首先判断ew emptyOfWhere是否存在where条件 有的话再拼接上去 ew customSqlSegment
  • java毕业设计——基于JSP+JavaBean+sqlserver的在线购物系统设计与实现(毕业论文+程序源码)——在线购物系统

    基于JSP JavaBean sqlserver的在线购物系统设计与实现 毕业论文 程序源码 大家好 今天给大家介绍基于JSP JavaBean sqlserver的在线购物系统设计与实现 文章末尾附有本毕业设计的论文和源码下载地址哦 需要
  • 品味树莓派:GPIO Zero库使用入门

    文章目录 目的 基础说明 入门使用 LED PWMLED Button 更多入门例程 类基础说明 注意事项 总结 目的 树莓派有很多GPIO口可供用户使用 官方同时也提供了一些方式来操作这些IO口 其中目前主要推荐的是基于Python的GP
  • 1、什么是Shader

    什么是Shader Shader 中文名为着色器 Shader其实就是专门用来渲染图形的一种技术 通过shader 我们可以自定义显卡渲染画面的算法 使画面达到我们想要的效果 小到每一个像素点 大到整个屏幕 Shader分为两类 顶点Sha