shader

Shader(二) 定点和片元shader实例

随声附和 提交于 2020-02-23 04:55:09
sinShader Shader "Custom/SinShader" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; v2f vert (appdata v) { v2f o; float dist = distance(v.vertex.xyz,float3(0,0,0)); float h = sin(dist*2 + _Time.z)/5; v.vertex.y = h; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v

主角场景Shader效果:光影

拟墨画扇 提交于 2020-02-21 07:06:14
基本思路:unity有一种很容易实现光影效果的神器,那就是unity自带的projector。 首先需要用到两张贴图: 一张投影需要的光圈贴图,如下: 一张根据远近距离显示暗淡的贴图(左至右,白渐变黑),如下: 主要用到两个参数:_Projector 和 _ProjectorClip mul(_Projector, vertex):用于计算要投影的图片正确的显示到场景上接受投影的位置 mul(_ProjectorClip, vertex)://用于计算投影位置和投影器之间的距离 1 Shader "xj/ModelEffect/ProjectorLight" { 2 Properties { 3 _Color ("Main Color", Color) = (1,1,1,1) 4 _ShadowTex ("Cookie", 2D) = "" {} 5 _FalloffTex ("FallOff", 2D) = "" {} 6 _intensity ("Intensity", float) = 1.0 7 } 8 9 Subshader { 10 Tags {"Queue"="Transparent"} 11 Fog {Mode Off} 12 13 Pass { 14 ZWrite Off 15 //Fog { Color (0, 0, 0) } 16 ColorMask RGB

unity, multi pass shader中的surface pass

眉间皱痕 提交于 2020-02-20 01:43:52
今天尝试写一个multi pass shader,但其中有一个Pass是surface pass,总是莫名奇妙地报错。后来看到下面帖子: http://forum.unity3d.com/threads/achieving-a-multi-pass-effect-with-a-surface-shader.96393/ 此帖3楼中写道:“ You can add arbitrary passes while using a surface shader. You just stick everything else in Pass {} tags and ensure that your surface shader isn't inside any of them (as Unity will generate them as it parses the surface shader). ” 即multi Pass shader中的surface Pass都不要加Pass{}标签。因为surface Pass在编译时会自动生成Pass{}标签。 --- 另外一个相关的帖子:http://answers.unity3d.com/questions/354774/index.html?sort=oldest 来源: https://www.cnblogs.com/wantnon/p

-OPENGL4-

人盡茶涼 提交于 2020-02-16 19:44:57
CP13: 全部合并成头文件,实现进一步抽象简洁 一个摄像机GLFWCamera.h 一个读取材质LoadShader.h 一个FrameWindow #ifndef WINDOW_H #define WINDOW_H #undef GLFW_DLL #include <GLFW/glfw3.h> #define GLEW_STATIC #include <GL/glew.h> class FrameWindow { public: FrameWindow(int width,int height,const char*title="OpenGL"); virtual ~FrameWindow(); GLFWwindow *getWindow(); private: GLFWwindow *window; int w; int h; }; FrameWindow::FrameWindow(int width,int height,const char*title){ w = width; h = height; glfwInit(); window = glfwCreateWindow(width,height,title,NULL,NULL); glfwMakeContextCurrent(window); glewInit(); } FrameWindow::

在谈GPUInstance

筅森魡賤 提交于 2020-02-16 14:26:20
官方网址:https://docs.unity3d.com/Manual/GPUInstancing.html 之前的博客:https://blog.csdn.net/wodownload2/article/details/103705433 知乎:https://zhuanlan.zhihu.com/p/34499251 csdn:https://blog.csdn.net/leonwei/article/details/73274808 introduction use gpu instancing to draw (or render) multiple copies of the same Mesh at once, ’ using a small number of draw calls. it is useful for drawing objects such as buildings, trees and grass, or other things that appear repeatedly in a Scene. gpu instancing only renders identical Meshes with each draw call, but each instance can have different parameters (for

(一)GL简介

你离开我真会死。 提交于 2020-02-15 15:16:25
文章目录 1.前言 2.简单示例 2.1 基本方法 2.2 调用位置 2.3 设置材质 2.4 完整代码 1.前言 Unity GL类是Low-Level图像类,提供了最基本的图形画法,其与OpenGL的直接画法类似。但是与Graphics类相比,Graphics类更高效。 GL类一般不能再update以及start等脚本方法中调用(可以调用,但是不会显示)。因为在Unity脚本的生命周期中,当开始渲染时camera会clear图像,如果在生命周期的渲染方法调用前调用GL类进行绘制,那么此时绘制的图像很大可能会被Clear掉,所以不会显示。 2.简单示例 本文以官方文档中的一个 示例 进行分析,并作了简单的修改。 2.1 基本方法 GL类提供了五种最基本的图像绘制种类,即线、三角形和四边形,绘制时以GL.Begin开始,以GL.End结束,中间通过GL.Color来更改颜色,通过GL.Vertex或者GL.Vertex3来添加顶点,如下所示。如果需要进行矩阵变换,则在GL.Begin之前进行矩阵变换,后续会对矩阵问题进行详细分析。 private void DrawLines ( ) { GL . Begin ( GL . LINES ) ; float angleDelta = 2 * Mathf . PI / lineCount ; for ( int i = 0 ; i <

三维渲染流程

故事扮演 提交于 2020-02-14 13:59:25
输入装配 顶点缓存(位置,颜色,法线,纹理坐标) 顶点索引缓存 CPU传输到GPU 通过图形总线PCI Express 定义顶点拓扑结构 坐标系转换 Vertex Shader 网格的数据是局部坐标系 变换到世界坐标系 -- 通过矩阵的平移、旋转、缩放 变换到观查坐标系 -- 为了后续的投影变换及其他变换效率,进行 取景变换 (以摄像机为原点,光轴与Z轴一至的全体变换) 曲面细分 Shader Model 5.0 Hull Shader 细分控制着色器 Tessellation Stage(曲面细分) Domain Shader 细分计算着色器 几何着色器 Shader Model 4.0 Geometry Shader(几何着色器) 顶点处理,与Vertex Shader不同的是一次一批顶点,可增加或减少几何数据 stream-output stage 输出流保存数据 屏幕映射: 裁剪 -- 视域体(视截体)外的去掉 透视投影 -- 为产生近大远小视觉效果,用视域体创建投影矩阵 视口变换 -- 将投影矩阵的顶点坐标转化为屏幕的视口坐标 背面消隐 -- 根据模型对摄像机朝向标记背面 光栅化 决定最终屏幕上的像素数量。 绘制每个三角形单元,计算构成三角形单元的每个像素的值。 像素着色阶段 Pixel Shader 它的输入是顶点间插值后的顶点属性(位置,法向量),还有纹理等

图形渲染管线简介

元气小坏坏 提交于 2020-02-14 13:58:34
The Graphics Rendering Pipeline 渲染管线,这章主要讲光栅化渲染管线。 毕业前实习时,也实现过一个简单的软光栅化渲染管线,再复习一下。 在计算机图形学领域,shading指基于表面相对灯光的角度、距灯光的距离、相对于相机的角度和材质的属性等来修改物体/表面/多边形的颜色,进而创造一个具有真实感效果的过程。 In computer graphics, shading refers to the process of altering the color of an object/surface/polygon in the 3D scene, based on things like (but not limited to) the surface's angle to lights, its distance from lights, its angle to the camera and material properties (e.g. bidirectional reflectance distribution function) to create a photorealistic effect. Shading is performed during the rendering process by a program called a

使用D3D渲染YUV视频数据

社会主义新天地 提交于 2020-02-13 09:12:31
源代码下载 在PC机上,对于YUV格式的视频如YV12,YUY2等的显示方法,一般是采用DIRECTDRAW,使用显卡的OVERLAY表面显示。OVERLAY技术主要是为了解决在PC上播放VCD而在显卡上实现的一个基于硬件的技术。OVERLAY的出现,很好的解决了在PC上播放VCD所遇到的困难。早期PC处理能力有限,播放VCD时,不但要做视频解码工作,还需要做YUV到RGB的颜色空间转换,软件实现非常耗费资源,于是,YUV OVERLAY表面出现了,颜色空间转换被转移到显卡上去实现,显卡做这些工作是具有天生优势的。 随着显卡技术的发展,OVERLAY的局限性也越来越充分的暴露出来。一般显卡只支持一个OVERLAY表面,用OVERLAY实现多画面比较困难,视频和文本的叠加也有困难,当然,要实现一些特效就更难了。更重要的是,OVERLAY技术在显卡上是属于2D模块,在高品质3D游戏的推动下,现在的显卡的功能和性能,主要体现在3D模块上,厂商投入最大的,也是在GPU的3D模块上。OVERLAY技术无法利用和发挥显卡GPU的3D性能。微软早就停止了对DIRECTDRAW的支持,鼓励开发人员转向DIRECT3D,所以OVERLAY也无法使用新的API。 早期的3D渲染,主要是使用CPU做的,显卡做的较少。后来,显卡GPU的处理能力越来越强,承担的3D渲染功能也越来越多

Unity Shader Early-Z技术

老子叫甜甜 提交于 2020-02-09 23:06:08
Early-Z技术 传统的渲染管线中,ZTest其实是在Blending阶段,这时候进行深度测试,所有对象的像素着色器都会计算一遍,没有什么性能提升,仅仅是为了得出正确的遮挡结果,会造成大量的无用计算,因为每个像素点上肯定重叠了很多计算。 因此现代GPU中运用了Early-Z的技术,在Vertex阶段和Fragment阶段之间(光栅化之后,fragment之前)进行一次深度测试,如果深度测试失败,就不必进行fragment阶段的计算了,因此在性能上会有很大的提升。但是最终的ZTest仍然需要进行,以保证最终的遮挡关系结果正确。 前面的一次主要是Z-Cull为了裁剪已达到优化的目的,后一次主要是Z-Check,为了检查,如下图: Early-Z的实现,主要是通过一个Z-pre-pass显示,简单来说,对于所有不透明的物体(透明的没有用,本身不会写入深度),首先用一个超级简单的shader进行渲染,这个shader不写入颜色缓冲区,只写深度缓冲区,第二个pass关闭深度写入,开启深度测试,用正常的shader进行渲染。其实这种技术,我们也可以借鉴,在渲染透明物体时,因为关闭了深度写入,有时候会有其他不透明的部分遮挡住透明的部分,而我们其实不希望他们被遮挡,仅仅希望被遮挡的物体半透,这时我们就可以用两个pass来渲染,第一个pass使用Color Mask屏蔽颜色写入,仅写入深度