shader

unity shader 着色器实例 代码+详解注释 【模型顶点抖动,顶点无节操的随机升降抖动效果】

筅森魡賤 提交于 2020-01-28 05:36:17
如果代码中有什么不清楚请查看以下基础知识 Shader基础知识 unity3d 中 七种坐标知识详解 随机抖动的效果 该效果随机上下抖动顶点,适合给静态模型增加动感。类似小时候我们看的一些定格动画或剪纸的效果。有些2d游戏也会使用类似的功能,这是3d版本,2d同理。 shader的随机数 shader中没有随机函数。所以需要我们自己编写。代码中出现的随机数实现方式是网上摘抄的,由于发现了很多帖子都有这段代码,所以没法注明出处。有人知道原版是谁的请告诉我,我好注明出处。 Shader "Unlit/simple" { //变量接口 Properties { //线段长度 _LineLength ( "Length" , float ) = 1. //线段颜色 _LineColor ( "Color" , COLOR ) = ( 0 , 1 , 0 , 1 ) } //着色器正文 SubShader { //着色器程序块 Pass { Tags { "RenderType" = "Opaque" } LOD 200 CGPROGRAM # pragma target 5.0 //顶点着色器,用于处理位置信息 # pragma vertex vert //片元着色器,用于处理颜色 # pragma fragment frag //几何着色器,DirectX 10新增的

从零开始手撸WebGL3D引擎2:WebGL和3D编程基础概念

佐手、 提交于 2020-01-28 04:53:38
我们在第一篇里面浏览了一下WebGL的参考卡片,也列出了一些WebGL的功能点,但是对于没有接触过3D编程的人来说,这些东西很难理解并形成一个统一的认识。所以这篇我就以WebGL为参考平台谈谈3D编程的一些基础概念。 3D坐标系变换 正常来说,人们学习新东西都会从已有的知识出发,对于3D编程,在屏幕上画出3D图形,如果有2D图形API使用的基础,就会想着从2D编程的经验出发。比如对于2D编程,都是指定一个屏幕坐标,设定一个颜色,去画一个点,你能画点就能画任何东西,很简单很直观。但是到3D这儿就不行了,因为你没法简单直接且直观的指定一个立方体的各个点在屏幕上是什么位置。为了解决这个问题,在3D编程中,需要将3D空间的点变换到屏幕空间,即我们在3D空间指定点的坐标(一组3d坐标),然后设置一个摄像机,将摄像机镜头拍到的点映射到屏幕上,这样就可以绘制出来。这个过程就需要用不同的坐标空间,以及在这些坐标空间之间变换坐标。简单说一说。 模型空间 3D模型通常由很多三角形构成,而每个三角形又是由三个顶点构成。一个3D模型有很多顶点,这个顶点的坐标定义在模型自身的坐标系中,这个坐标系就是模型空间。坐标系的原点根据模型的形状特点以及使用的方便情况而设置。比如两足动物(人)的模型,通常将坐标原点放在两脚中间。而球的模型中心一般放在球心。使用模型空间一方面建模方便,另一方面同样的模型可以复用

对Shader Variant的研究(概念介绍、生成方式、打包策略)

做~自己de王妃 提交于 2020-01-27 22:21:47
unity 打包动态生成 ShaderVariantCollection 对Shader Variant的研究(概念介绍、生成方式、打包策略) https://blog.csdn.net/RandomXM/article/details/88642534 基础知识介绍 什么是ShaderVariant 在写shader时,往往会在shader中定义多个宏,并在shader代码中控制开启宏或关闭宏时物体的渲染过程。最终编译的时候也是根据这些不同的宏来编译生成多种组合形式的shader源码。其中每一种组合就是这个shader的一个变体(Variant)。 Material ShaderKeywords与ShaderVariant Material所包含的Shader Keywords表示启用shader中对应的宏,Unity会调用当前宏组合所对应的变体来为Material进行渲染。 在Editor下,可以通过将material的inspector调成Debug模式来查看当前material定义的Keywords,也可在此模式下直接定义Keywords,用空格分隔Keyword。 在这里插入图片描述 在程序中,可用Material.EnableKeyword()、Material.DisableKeyword()、Shader.EnableKeyword()、Shader

WebGL渲染2D图形

拥有回忆 提交于 2020-01-27 13:59:48
WebGL是通过OpenGL ES在HTML的<canvas></canvas>上渲染图形的。 ... <canvas id="main-canvas"></canvas> ... let gl = document.getElementById("main-canvas").getContext("webgl"); if (!gl) { alert("无法使用WebGL!"); } else { console.log(gl); } 这样,就获取到了在canvas上渲染webgl的上下文。 接下来,在canvas上一切的渲染操作,最终都是要依靠这个gl变量来控制的。 不过在此之前,需要作一下前期准备。 着色器准备 首先要准备一下着色器的源码,着色器(shader)是由GLSL(OpenGL Shadering Language,一种类C++语言)编写的计算机程序。着色器是成对出现的,分别是顶点着色器: <script type="notjs" id="vertex-shader-2d"> attribute vec4 a_position; void main() { gl_Position = a_position; } </script> 和片段着色器: <script type="notjs" id="fragment-shader-2d"> precision

unity shader 空间坐标转换

萝らか妹 提交于 2020-01-27 11:53:46
空间转换 v2f vert ( a2v v ) { v2f o ; //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。 o . vertex = UnityObjectToClipPos ( v . vertex ) ; //将顶点从模型空间转换为裁剪空间,因为2d就是平面映射。 o . vertex = UnityObjectToClipPos ( v . vertex ) ; //模型坐标转为世界坐标,因为要计算绝对位置 o . pos = mul ( unity_ObjectToWorld , v . vertex ) ; //将坐标转为裁剪空间,否则就无法正常可视化 o . pos = mul ( UNITY_MATRIX_VP , o . pos ) ; //输出法线 = 转换后的世界坐标法线 float3 worldNormal = UnityObjectToWorldNormal ( o . normal ) ; //从世界坐标转换到裁剪空间的坐标信息 pIn . pos = mul ( UNITY_MATRIX_VP , p [ 0 ] . pos ) ; //从世界坐标转换到裁剪空间的坐标信息 pIn1 . pos = mul ( UNITY_MATRIX_VP , pos ) ; //当前的模型观察矩阵, 用于将顶点/方向数据从模型空间变换到观察空间

从0开发3D引擎(九):实现最小的3D程序-“绘制三角形”

冷暖自知 提交于 2020-01-26 20:01:03
目录 上一篇博文 运行测试截图 需求分析 目标 特性 头脑风暴 确定需求 总体设计 具体实现 新建Engine3D项目 实现上下文 实现_init 实现“获得WebGL上下文” 实现“初始化所有Shader” 实现“初始化场景” 实现“设置清空颜色缓冲时的颜色值” 返回用于主循环的数据 实现_loop 实现“主循环” 实现“clearCanvas” 实现“_render” 最终的分层和领域模型 总结 本文完整代码地址 大家好,本文开始编程,实现最小的3D程序。 我们首先进行需求分析,确定功能点; 然后进行总体设计,划分模块,并且对模块进行顶层设计,给出类型签名和实现的伪代码; 最后进行具体实现,实现各个模块。 注:在Reason中,一个Reason文件(如Main.re)就是一个模块(Module)。 上一篇博文 从0开发3D引擎(八):准备“搭建引擎雏形” 运行测试截图 测试场景包括三个三角形: 需求分析 首先,我们分析最小3D程序的目标和特性; 接着,根据特性,我们进行头脑风暴,识别出功能关键点和扩展点; 最后,根据功能关键点和扩展点,我们确定最小3D程序的功能点。 目标 可从最小3D程序中提炼出通用的、最简化的引擎雏形 特性 为了达成目标,最小3D程序应该具备以下的特性: 简单 最小3D程序应该很简单,便于我们分析和提炼。 具有3D程序的通用特性

Unity Shader学习记录第一章

浪尽此生 提交于 2020-01-26 00:48:50
No.1 学习对象为[大神冯乐乐的CSDN](https://blog.csdn.net/candycat1992/category_9262054.html) 本节主要学习了 属性 Properties 三种自定义光照模型函数 漫反射光照模型 半兰伯特光照模型 渐变图实现双向反射分布优化的光照模型 tex2D函数 dot函数等 代码记录如下 学习对象为 大神冯乐乐的CSDN 本节主要学习了 属性 Properties 三种自定义光照模型函数 漫反射光照模型 半兰伯特光照模型 渐变图实现双向反射分布优化的光照模型 tex2D函数 dot函数等 代码记录如下 ```csharp Shader "Unlit/BasicDiffuse" { Properties { _MainTex ( "texture" , 2 D ) = "white" { } _RampTex ( "_RampTex" , 2 D ) = "white" { } _EmissiveColor ( "EmissiveColor" , COLOR ) = ( 1 , 1 , 1 , 1 ) _AmbientColor ( "AmbientColor" , COLOR ) = ( 1 , 1 , 1 , 1 ) _MySliderValue ( "This is a Slider" , Range ( 0 , 10 )

[UnityShader入门精要读书笔记]27.屏幕后处理

天大地大妈咪最大 提交于 2020-01-25 05:49:14
屏幕后处理,顾名思义,通常指的是在渲染完整个场景得到屏幕图像后,再对这个图像进行一系列的操作,实现各种屏幕特效。因此,想要实现屏幕后处理的基础在于得到渲染后的屏幕图像,即抓取屏幕,Unity提供了接口——OnRenderImage函数,声明如下:MonoBehaviour.OnRenderImage(RenderTexture src, RenderTexture dest)。 当我们在脚本中声明此函数后,Unity会把当前渲染得到的图像存储在第一个参数对应的源渲染纹理中,通过函数重点一系列操作后,再把目标渲染纹理,即第二个参数对应的渲染纹理显示到屏幕上。在OnRenderImage函数中,我们通常是利用Grapics.Blit函数来完成对渲染纹理的处理。它有3种函数声明: public static void Blit(Texture src,RenderTexture dest); public static void Blit(Texture src,RenderTexture dest,Material mat,int pass = -1); public static void Blit(Texture src,Material mat,int pass = -1); 其中,参数src对应了源纹理,在屏幕后处理技术中

Unity Fresnel Hero(Dota2) Shader

我的梦境 提交于 2020-01-25 00:24:00
Shader "HeroShader" { Properties { _Color ("Main Color", Color) = (1,1,1,1) _RimColor ("Rim Color", Color) = (0.97,0.88,1,0.75) _RimPower ("Rim Power", Float) = 2.5 _Fresnel ("Fresnel Value", Float) = 0.28 _MainTex ("Base (RGB)", 2D) = "white" {} _BumpMap ("Bump (RGB)", 2D) = "bump" {} _SpecularTex ("Specular Level (R) Gloss (G)", 2D) = "gray" {} _RimTex ("Rim ramp (RGB) Fresnel ramp (A)", 2D) = " grey" {} _WrapTex ("Wrap ramp (RGBA)", 2D) = "black" {} _Cutoff ("Alpha cutoff", Range (0,1)) = 0.5 } SubShader { Tags { "RenderType" = "Opaque" } AlphaTest Greater [_Cutoff] Blend Off Cull Off

Is there a way to cache slow WebGL shader compilation if the shader never changes?

隐身守侯 提交于 2020-01-25 00:19:19
问题 I have a WebGL shader which compiles perceptually immediately (Chrome on Windows 7) when I have this: void main(void) { if (antialias_level == 1) gl_FragColor = NewtonIteration((gl_FragCoord.xy + offset) / zoom); else if (antialias_level == 2) gl_FragColor = (NewtonIteration((gl_FragCoord.xy + offset + vec2(-0.25, -0.25)) / zoom) + NewtonIteration((gl_FragCoord.xy + offset + vec2(0.25, 0.25)) / zoom)) * 0.5; } But it takes a very long time (~10 sec) to compile this: void main(void) { if