unity shader编程
莫之
不努力奔跑,怎么能停在原地
展开
-
Unity 一些用于调试的Shader总结
前言在Shader的调试中,将数据进行可视化是常见策略,这里总结一下一些关键数据的可视化UVs的可视化UV和第二UV的可视化:Shader "Debug/UV 1" {SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" // vertex input: posi原创 2020-09-11 01:06:25 · 1133 阅读 · 0 评论 -
Shader中的代码优化原理分析
问题概述原创 2020-09-01 10:42:12 · 1615 阅读 · 0 评论 -
Unity shader之Flowmap贴图的原理
知乎 简单了解flowmap的使用-https://zhuanlan.zhihu.com/p/33288033原创 2020-05-19 19:39:30 · 7160 阅读 · 0 评论 -
Unity 内置Surface着色器转换到vert/frag着色器
本文出发点在于,从ASE工具导出的顶点片元着色器,需要进行重写!surface原创 2020-04-29 18:24:22 · 2303 阅读 · 1 评论 -
Unity Shader代码优化资料收集
shader代码优化 注意数据精度的选择 减少if-else分支结构,使用step等内置函数 减少复杂函数的使用 CPU端(drawcall的性能消耗),顶点着色器和片元着色器,能在顶点着色器中做就在顶点着色器中做,但是顶点着色器中的实现有时候会降低表现效果; 1.gpu是SIMD的架构,即单指令多数据流架构,即在gpu上同时执行n个数据和...原创 2020-04-29 18:06:50 · 292 阅读 · 0 评论 -
Unity Shader之模板测试 原理与应用
一、认识模板测试模板测试是在逐片元测试几个阶段中的第一个阶段,它是在深度测试和融混之前的;在平时,我们可能会接触深度测试比较多一点,所以接下来在认识模板测试的时候,经常会与深度测试做比较,以辅助大家来理解模板测试;首先,想要进行模板测试,就需要有一个缓冲区,这个缓冲区就是模板缓冲;只有在建立一个窗口过程中预先请求模板缓冲,才能够进行模板测试,如果没有模板缓冲,则默认通过模板测试;很多窗口库...原创 2020-03-10 02:33:36 · 2259 阅读 · 0 评论 -
Unity Shader 变体处理与预加载流程
一、优化Shader加载时间1.优化shader加载时间Shader程序是需要在GPU中的,将其从磁盘加载到显存中当然需要一些时间,单个的GPU程序一般不会花费太多的加载时间,但是一个Shader通常会有大量的变体,也就是一个Shader可能会有很多个GPU程序,从而引起了加载时间过长的问题;举个Standard Shader的例子,如果它被完全编译,该Shader将会生成上千个有细微...原创 2020-04-07 15:02:43 · 8832 阅读 · 0 评论 -
Unity Shader深度纹理、法线纹理的使用
前言:在进行屏幕后处理的时候,我们往往会应用很多图像处理的相关算法,例如高斯模糊,sobel边缘检测等等。但是这些图像算法都是基于图像的颜色值来计算的,而我们通过渲染管线得到屏幕图像时,不仅可以得到颜色缓冲,还可以得到深度缓冲以及法线信息等。更多的信息可以为我们提供更多的方法去处理和计算,例如,在边缘检测时,我们如果用sobel基于颜色信息计算得到边缘,那最终得到的边缘信息会受到物体纹理以及光照等...原创 2020-06-01 21:21:50 · 1085 阅读 · 0 评论 -
Unity Shader透明效果基础知识
前言: 在unity中主要有两种透明效果的实现,透明度测试和透明度混合,透明度测试比较简单暴力,就是对片元的alpha通道的值进行测试,满足条件就留下该片元,不满足就抛弃该片元,所以在本章中主要讨论第二种---透明度混合。本书主要内容是对UnityShader入门精要的总结。一、透明度混合与渲染顺序的联系为什么半透明效果的渲染要打开深度测试而要关闭深度写入?在渲染不透...原创 2019-01-24 14:14:39 · 1808 阅读 · 0 评论 -
Unity Cull 背面剔除
本文主要是自己对面剔除的一些理解和感悟,如有理解不当的地方,欢迎交流指正一、基本概念介绍面剔除就是指检查一个面相对于摄像机也就是观察者的朝向是顺时针还是逆时针,以三角形举例,如果一个三角形我们从正面看它是顺时针,那么背面就是逆时针,以此来区分正面和被面。在unity里默认的就是背面剔除,比如一个平面,添加了标准材质后它只有正面可以看到,背面则观察不到;(以立方体为例,立方体的每个面都是...原创 2019-07-24 23:53:12 · 10111 阅读 · 2 评论 -
关闭深度测试的渲染规则
一、问题提出这是一个立方体在关闭了剔除(Unity背面剔除)和深度写入后的呈现效果,由于关闭了深度测试后不用再比较深度信息,所以就不清楚颜色信息到底是如何进行处理的。二、基元的绘制顺序每一个立方体有多个面,每个面的片元绘制顺序是由该面的顶点数据在几何模型中的顺序决定的,也就是在渲染管线中的几何阶段准备顶点数据传入GPU时,会有一个图元的顺序,比如一个立方体有12个三角形,就要依次准...原创 2019-07-25 12:18:07 · 1554 阅读 · 0 评论 -
Unity Shader基础知识一览
前言:建议学习shader之前一定要了解可编程渲染管线以及GPU硬件结构;一、GPU编程与三大着色语言介绍GPU编程:我们所提到的shader程序,它是在GPU上运行的,它的运行原理和GPU的硬件结构是息息相关的,我们需要能够在GPU上能够运行的语言,也就是着色语言;GLSL(OpenGL Shading Language):由OpenGL提供;它的优点在于跨平台性,主要是因为Open...原创 2019-08-29 18:47:56 · 996 阅读 · 0 评论 -
AssetDatabase类
一、AssetDatabase类属性及函数首先提供官方参考文档:API-Reference-AssetDatabase概述:AssetDatabase类声明在UnityEditor命名空间内;它用于访问资源以及对资源执行一些操作,主要是对Project面板下的资源进行增删改查操作,它仅仅可以在编辑器中使用,用于开发者自身的工具扩展;属性方法public static st...原创 2019-08-14 18:55:18 · 980 阅读 · 0 评论 -
Unity Shader预编译指令
一、、顶点着色器和片段着色器的编译指令我们在unity中最常见的就是下面前两种,使用就不必介绍了,这里会针对其它一些较为常用的编译指令做一下详细介绍。1、#pragma vertex name:编译name函数为顶点着色器 2、#pragma fragment name:编译name函数为片段着色器 3、#pragma geometry name:编译name函数为DX10的几何着色器,...原创 2019-01-10 00:26:58 · 1986 阅读 · 0 评论 -
Unity Shader语法基础
本文主要参考来自《unity shader入门精要》一书一.ShaderLab属性类型和Cg变量类型的匹配关系Color,Vector----float4,half4,fixed4Range,Float----float,half,fixed2D----sampler2DCube----samplerCube3D----sampler3D属性的修饰符有如下几种:二.Cg...原创 2019-01-10 00:09:25 · 1604 阅读 · 0 评论 -
Unity Shader编程细节
前言:这篇文章主要是把自己使用shader遇到的一些想法和经验总结起来,会一直更新内容。1.通用编译指令#pragma vertex name#pragma fragment name2.Cg/HLSL的语义,语义是不可省略的,它将告诉系统用户需要输入哪些值以及用户的输出是什么。POSITION:告诉unity,把模型的顶点坐标输入SV_POSITION:告诉unity,顶点着色器...原创 2019-01-10 00:06:58 · 697 阅读 · 0 评论 -
CPU和GPU通信
1.应用阶段可大致分为以下三个小阶段a.把数据加载到显存中b.设置渲染状态c.调用drawcall2.将数据加载到显存中所有需要渲染的数据都需要从硬盘加载到系统内存中。然后网格和纹理等数据又被加载到显卡的存储空间--显存中。因为显卡对显存的访问速度更快,而且,大多数显卡对RAM(系统内存)没有直接访问的权利。3.渲染状态什么是渲染状态,通俗解释就是:这些状态定义了场景中的网格是怎...原创 2018-07-18 11:34:40 · 1276 阅读 · 0 评论 -
理解GPU渲染管线
0.本文详细描述GPU是如何实现概念阶段的后两个阶段几何阶段和光栅化阶段可以分成若干个更小的流水线阶段,这些流水线阶段由GPU来实现,每个阶段GPU提供了不同的可配置性或可编程性。下面的知识点会涉及到一些基础的词汇概念,大家不明白的可以参考这篇文章:https://blog.csdn.net/u014800094/article/details/530358891.顶点着色器(可编程)...原创 2018-07-18 11:34:29 · 1289 阅读 · 0 评论 -
unity shader 顶点着色器的矩阵变换
本文主要讲述在unity shader的顶点着色器内对顶点的坐标进行矩阵变换,一、基础变换之伸缩变换仿射变换:渲染管线顶点着色器内在空间坐标系中做的各种变换都是仿射变换;仿射变换是线性变换加平移变换,而在基础变换中,旋转变换和缩放变换都是线性变换,它们和平移变换一起组成的仿射变换成为了顶点着色器内坐标转换的基础;主要的基础变换有平移变换,旋转变换和缩放变换,这里讲述缩放变换,其它两种类...原创 2018-07-30 21:29:53 · 3503 阅读 · 0 评论 -
unity shader 趣味效果(1)--图形图像的平移和放缩
该文章主要是介绍一下如何绘制函数的图像,以及对函数图像进行一些基本的平移,旋转和缩放等操作。一、绘制函数图像绘制函数图像其实就是把函数的顶点绘制出来,也就是把所有满足函数方程的像素点用不同于背景的颜色绘制出来。例如我们绘制y=x的图像,其实就是把像素点坐标中x和y相等的那些像素用不同的颜色渲染出来,颜色这里记作LineColor,当然这里的相等需要有个范围,也就是线条需要有一个宽度,这里记...原创 2018-10-23 00:00:22 · 1465 阅读 · 0 评论 -
unity shader 趣味效果(2)--图形的旋转
本章内容是继上篇unity shader 趣味效果 (1) --图形图像的平移和缩放继续进行完善和补充。一、坐标变换旋转变换是根据旋转角度(angle)和旋转中心(center)来计算某个像素点旋转之后的坐标。例如一个像素点(x1,y1),旋转中心(center.x,center.y),旋转角度逆时针angle,那么我们可以先计算出该像素点与x轴正方向所成的角度,假如为angle1,那么旋...原创 2018-10-25 19:29:06 · 1817 阅读 · 0 评论 -
Unity Shader 笛卡尔定理--2D平面下的笛卡尔内切圆效果
前言第一次接触shadertoy是在一篇博客里,进入shadertoy里面以后就如同进入了一个新的世界,里面各种唯美的效果,令人叹为观止。看到了一些非常有趣的想法,而且还有非常好的实现,对于喜爱shader的同学简直是欲罢不能了。shadertoy主要还是使用glsl来开发的,但略有不同,在知乎上看到一篇文章,里面总结了很多关于shadertoy入门和学习的资料,https://www.z...原创 2018-11-19 23:18:39 · 412 阅读 · 0 评论 -
Unity Shader屏幕特效基础OnRenderImage()函数
前言:unity shader中的pass是会顺序执行的,但是由于在图像处理中我们常常需要使用一个pass的处理结果作为另一个pass的输入,这个时候就需要用到OnRenderImage()函数了。一、函数介绍MonoBehaviour.OnRenderImage(RenderTexture source,RenderTexture destination)官方描述Descrip...原创 2019-01-11 16:34:13 · 18246 阅读 · 2 评论 -
UnityShader屏幕后处理效果之碎屏效果
前言:本篇是开始撰写的第一篇关于屏幕后处理效果的图片,所有的屏幕后处理效果其实就是对相机渲染得到的纹理再次处理,本质上都属于Image Processing(IP),即图像处理,包括之后会提到的各种滤波操作,运动模糊等效果。而图像处理是针对所有像素的,所以它基本上都是在片元着色器中进行计算,而不用关心几何着色器(主要用于坐标的转换)。一、使用法线贴图完成碎屏效果的原理首先讲碎屏效果,碎屏的...原创 2019-01-11 16:32:58 · 8068 阅读 · 0 评论 -
Unity着色器基础:标签和渲染状态
前言:一开始入门写着色器的时候主要关注于顶点着色器和片元着色器里的内容,可后来发现总是会在标签和渲染状态设置时掉进坑里,这里就索性参考官方文档以及其它前辈的博客好好整理一下。一、标签与渲染状态介绍SubShader中定义了一系列Pass以及可选的状态--RenderSetup和标签设置--Tags。每个pass定义了一次完整的渲染流程,如果Pass数目过多,会造成渲染性能的下降。因此我们应...原创 2019-01-23 14:57:22 · 576 阅读 · 0 评论 -
Unity法线贴图
一、凹凸贴图凹凸贴图主要用于增强表现细节,核心在于法线,因为光照模型中法线是影响物体表面细节的重要因素,而法线贴图就是一种非常常见和重要的凹凸贴图。二、法线贴图法线贴图其实就是将物体的法线信息存入到贴图中,一个像素点的4个分量可以分别代表不同的信息,当它的xyz都用来存储物体的法线信息的时候这就是一张法线贴图,如果存储的是别的属性信息,那它就是别的图。切线空间的法线:x轴代表该点的...原创 2019-01-11 16:32:42 · 1840 阅读 · 0 评论 -
unity 着色器内置文件与内置变量
1.常用的几个内置文件这些文件通常都被封装在cginc文件中,通过文件的包含来实现对文件中函数及变量的引用,大家可以到unity的安装目录下找到对应的文件,当然我们也可以写一些自己的cginc文件放置到该目录中,方便自己使用,具体方法可以参考Unity着色器代码复用。A.UnityCG.cginc1.这里包含了最常使用的帮助函数、宏和结构体。2.UnityCG.cginc中一些常用...原创 2019-01-09 11:36:04 · 1257 阅读 · 0 评论 -
Unity着色器CGINCLUDE与pass复用
这里总结一下在unity shader中如何实现代码的复用,如何自己造轮子。1.CGINCLUDE和ENDCG代码块unity会把 CGINCLUDE 和 ENDCG 之间的代码插入到每一个pass中,已达到声明一遍,多次使用的目的。例如,可以在 CGINCLUDE 和 ENDCG 之间 定义多个 顶点和片段方法,在pass里只要写明 #pragma vertex 顶点方法名 #pragm...原创 2019-01-09 11:42:23 · 1363 阅读 · 0 评论 -
Unity Shader前向渲染
前言:渲染路径的存在是帮助我们来处理更多数量和更多类型的光照。一、前向渲染中的原理前向渲染是通过深度缓冲和颜色缓冲来实现的,使用深度缓冲来决定一个片元是否可见,如果可见,则更新颜色缓冲区中的颜色值。如果场景中有n个物体受m个光源的影响,那么要渲染整个场景,则需要n*m个pass,如果m较多的话,这个开销还是比较大的。那么如何在得到理想效果的同时来节省性能呢,unity提供了一些策略来进...原创 2019-01-25 00:35:38 · 1672 阅读 · 0 评论 -
Unity Shader中的阴影渲染 理论与实践
前言:表面遮挡住光源路径就会产生阴影,由理想点光源产生的阴影边缘是比较锐利的,而现实世界中的阴影边缘确是模糊的,该模糊部分成为半影。半影的出现,是由于现实世界的点光源不是空间意义上的一个点,它会覆盖一定的面积,就会产生以不同角度掠过物体边缘的光线。在阴影的渲染技术中,通常都会把物体分为三个类别:投射阴影的物体,接收阴影的物体以及完全被阴影渲染忽略的物体。同时光源也可以被设置成产生阴影的和不...原创 2019-01-25 15:18:22 · 5157 阅读 · 4 评论 -
unity shader 基础光照模型与光照贴图
一.渲染总是围绕一个基础问题:如何决定一个像素的颜色;宏观来说,渲染包含两大部分:决定一个像素的可见性,决定这个像素的光照计算光照模型:用于决定在一个像素上进行怎样的光照计算。我们必须要明白我们是如何看到一个物体的,我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)...原创 2019-01-10 00:02:57 · 3386 阅读 · 0 评论 -
渲染管线的三个概念阶段
一.渲染管线,也称为渲染流水线渲染流水线可以分为三个概念性阶段:应用阶段,几何阶段,光栅化阶段。游戏场景中的物体渲染都是基于可编程流水线实现的,其实就是把绘制的3D物体通过可编程流水线绘制在2D的屏幕上的过程。什么是渲染(Rendering)渲染简单的理解可能可以是这样:就是将三维物体或三维场景的描述转化为一幅二维图像,生成的二维图像能很好的反应三维物体或三维场景二.三个阶段1...原创 2018-07-18 11:34:18 · 7251 阅读 · 0 评论