亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

ComputeShader(一)實例化大網(wǎng)格

2019-11-11 05:12:49
字體:
供稿:網(wǎng)友

最終效果

思路

圖解ComputeShader

這個圖片就是ComputeShader,值得注意的是Thread最多為1024個。應(yīng)該是考慮到當前顯卡的最低線程數(shù)的關(guān)系。

數(shù)據(jù)交換的效率

有圖可鑒,數(shù)據(jù)最好是單向輸出的,盡量避免交換。

網(wǎng)格實例化思路

腳本中根據(jù)核心數(shù)對需要實例化的網(wǎng)格進行頂點排序并記錄在uv信息中,然后合并網(wǎng)格,也可以利用dx11的SV_InstanceID(相關(guān)API可以查看MSCN的HLSL)。編寫ComputeShader,利用GPU對大量數(shù)據(jù)進行實時運算。編寫延遲光照Shader,根據(jù)處理后的數(shù)據(jù)對網(wǎng)格進行實時變動。

源代碼

腳本控制代碼

using UnityEngine;using System.Collections;using System.Runtime.InteropServices;using System.Collections.Generic;using UnityEngine.Assertions;#if UNITY_EDITORusing UnityEditor;#endifnamespace MatrixParticle{    public struct _Particle    {        Vector3 position;        Vector3 direction;        Vector3 scale;        Vector2 uv;        Vector4 color;        float lifeTime;    };    public class MatrixParticles : MonoBehaviour    {        const int VERTEX_MAX = 65534;        public ComputeShader shader;        public Material mat;        public Mesh mesh;        [SerializeField]        PRivate int xMod = 1, yMod = 1, zMod = 1;        [SerializeField]        private Vector3 scale = Vector3.one;        private ComputeBuffer particlesBuffer;        private int initKernal, updateKernal, emitKernal;        private int maxKernal;        private List<MaterialPropertyBlock> propertyBlocks = new List<MaterialPropertyBlock>();        private int perMeshNum, comMeshNum;        private Mesh combinedMesh;        void Start()        {            maxKernal = xMod * yMod * zMod * 1000;            shader.SetInt("_xMod", xMod * 10);            shader.SetInt("_yMod", yMod * 10);            shader.SetInt("_zMod", zMod * 10);            shader.SetVector("_Scale", scale);            initKernal = shader.FindKernel("Init");            updateKernal = shader.FindKernel("Update");            emitKernal = shader.FindKernel("Emit");            particlesBuffer = new ComputeBuffer(maxKernal, Marshal.SizeOf(typeof(_Particle)), ComputeBufferType.Default);            CreateMesh();            InitParticles();        }        void CreateMesh()        {            perMeshNum = VERTEX_MAX / mesh.vertexCount;            comMeshNum = (int)Mathf.Ceil((float)maxKernal / perMeshNum);            combinedMesh = CreateCombinedMesh(mesh, perMeshNum);            for (int i = 0; i < comMeshNum; i++)            {                MaterialPropertyBlock property = new MaterialPropertyBlock();                property.SetFloat("_Offset", perMeshNum * i);                propertyBlocks.Add(property);            }        }        void Update()        {            UpdateParticles();            DrawParticles(Camera.main);#if UNITY_EDITOR            if (SceneView.lastActiveSceneView)            {                DrawParticles(SceneView.lastActiveSceneView.camera);            }#endif        }        void InitParticles()        {            shader.SetBuffer(initKernal, "_Particles", particlesBuffer);            shader.Dispatch(initKernal, xMod, yMod, zMod);        }        void UpdateParticles()        {            shader.SetFloat("_Time", Time.deltaTime);            shader.SetBuffer(updateKernal, "_Particles", particlesBuffer);            shader.Dispatch(updateKernal, xMod, yMod, zMod);        }        public void EmitParticles(Vector3 pos, float height)        {            shader.SetVector("_Pos", pos);            shader.SetFloat("_Height", -height);            shader.SetBuffer(emitKernal, "_Particles", particlesBuffer);            shader.Dispatch(emitKernal, xMod, yMod, zMod);        }        void DrawParticles(Camera camera)        {            mat.SetBuffer("_Particles", particlesBuffer);            for (int i = 0; i < comMeshNum; ++i)            {                var props = propertyBlocks[i];                props.SetFloat("_IdOffset", perMeshNum * i);                Graphics.DrawMesh(combinedMesh, transform.position, transform.rotation, mat, 0, camera, 0, props);            }        }        void OnDestroy()        {            particlesBuffer.Release();        }        Mesh CreateCombinedMesh(Mesh mesh, int num)        {            int[] meshIndices = mesh.GetIndices(0);            int indexNum = meshIndices.Length;            List<Vector3> verts = new List<Vector3>();            int[] indices = new int[num * indexNum];            List<Vector3> normals = new List<Vector3>();            List<Vector4> tans = new List<Vector4>();            List<Vector2> uv0 = new List<Vector2>();            List<Vector2> uv1 = new List<Vector2>();            for (int i = 0; i < num; i++)            {                verts.AddRange(mesh.vertices);                normals.AddRange(mesh.normals);                tans.AddRange(mesh.tangents);                uv0.AddRange(mesh.uv);                for (int n = 0; n < indexNum; n++)                {                    indices[i * indexNum + n] = i * mesh.vertexCount + meshIndices[n];                }                for (int n = 0; n < mesh.uv.Length; n++)                {                    uv1.Add(new Vector2(i, i));                }            }            Mesh combinedMesh = new Mesh();            combinedMesh.SetVertices(verts);            combinedMesh.SetIndices(indices, MeshTopology.Triangles, 0);            combinedMesh.SetNormals(normals);            combinedMesh.SetTangents(tans);            combinedMesh.SetUVs(0, uv0);            combinedMesh.SetUVs(1, uv1);            combinedMesh.RecalculateBounds();            Vector3 size = new Vector3(xMod * 10 * scale.x, yMod * 10 * scale.y, zMod * 10 * scale.z);            combinedMesh.bounds = new Bounds(transform.position + size * 0.5f, size);            return combinedMesh;        }    }}

ComputeShader代碼

#pragma kernel Init#pragma kernel Emit#pragma kernel Update#include "./ComputeBuffer.cginc"RWStructuredBuffer<Particle> _Particles;int _xMod, _yMod, _zMod;float4 _Scale;float4 _Pos;float _Time;float _Speed;float _Height;float4 _LocalToWorld;inline uint Index(uint3 id){	return id.x + id.y * _xMod + id.z * _xMod * _yMod;}inline float Random(float2 seed){	return frac(sin(dot(seed.xy, float2(12.9898, 78.233))) * 43758.5453);}inline float3 Random3(float3 seed){	return float3(Random(seed.yz), Random(seed.xz), Random(seed.xy));}[numthreads(10, 10, 10)]void Init(uint3 id : SV_DispatchThreadID){	uint index = Index(id);	Particle p = _Particles[index];	p.position = id * _Scale.xyz;	p.direction = float3(0, 0, 1);	p.scale = _Scale.xyz;	p.uv = p.position.xy / (float2(_xMod, _yMod)*_Scale.xy);	float z = p.position.z / (_zMod *_Scale.z);	p.color = float4(z, z, z, 1);	p.lifeTime = -Random(id.xy);	_Particles[index] = p;}[numthreads(10, 10, 10)]void Update(uint3 id : SV_DispatchThreadID){	uint index = Index(id);	Particle p = _Particles[index];	if (p.lifeTime > 0 && p.lifeTime < _Time)	{		p.position = id * _Scale.xyz;		p.lifeTime = -Random(id.xy);	}	p.lifeTime -= _Time;	if (p.lifeTime < 0)	{		p.position += sin(p.lifeTime * 10)*float3(0, 0, 0.02f);	}	else	{		p.position += p.direction * _Time;	}	_Particles[index] = p;}[numthreads(10, 10, 10)]void Emit(uint3 id : SV_DispatchThreadID){	uint index = Index(id);	Particle p = _Particles[index];	float3 pos = id * _Scale.xyz;	float dis = clamp((20 - distance(pos.xy, _Pos.xy)) / 20, 0, 1);	dis = dis * dis * dis;	if (dis > 0.1)	{		float rand = Random(pos.xy);		float z = 1 - pos.z / (_zMod *_Scale.z);		p.position = float3(pos.x, pos.y, pos.z + z * _Height * rand * dis);		p.direction = float3(0, 0, -_Height * z  *  rand * dis);		p.lifeTime = 1;	}	_Particles[index] = p;}

Shader代碼

Shader "QQ/Mesh"{	Properties	{		_Color("Color",color)=(0.5,0.5,0.5,1)		_MainTex("Texture", 2D) = "white" {}	}		SubShader	{		Tags{ "RenderType" = "Opaque" }		CGINCLUDE		#pragma multi_compile_fog		#pragma target 5.0		#include "UnityCG.cginc"		#include "AutoLight.cginc"		#include "./ComputeBuffer.cginc"		uniform StructuredBuffer<Particle> _Particles;		uniform float _IdOffset;		uniform fixed4 _Color;		uniform sampler2D _MainTex;		uniform float4 _MainTex_ST;		uniform float4 _LightColor0;		inline int GetID(float2 uv)		{			return (int)(uv.x + 0.5 + _IdOffset);		}		ENDCG			Pass		{			Tags{"LightMode" = "Deferred"}			CGPROGRAM			#pragma vertex vert			#pragma fragment frag			#pragma multi_compile_shadowcaster			#pragma multi_compile ___ UNITY_HDR_ON			struct G_Buffer		{			fixed4 diffuse : SV_Target0;			float4 specSmoothness : SV_Target1;			float4 normal : SV_Target2;			fixed4 emission : SV_Target3;		};			struct a2v		{			float4 vertex : POSITION;			float3 normal : NORMAL;			float2 uv : TEXCOORD0;			float2 id : TEXCOORD1;		};		struct v2f		{			float4 pos : SV_POSITION;			float3 normal : NORMAL;			float2 uv : TEXCOORD0;			float4 color : TEXCOORD1;		};		v2f vert(a2v v)		{			Particle p = _Particles[GetID(v.id)];			v.vertex.xyz *= p.scale;			v.vertex.xyz += p.position;			v2f o;			o.pos = mul(UNITY_MATRIX_MVP, v.vertex);			o.uv = p.uv;			o.color = p.color;			o.normal = UnityObjectToWorldNormal(v.normal);			return o;		}		G_Buffer frag(v2f i)		{			i.normal = normalize(i.normal);			fixed4 col = tex2D(_MainTex, i.uv)*i.color;			clip(col.a - 0.2);			G_Buffer g;			g.diffuse = _Color;			g.specSmoothness = 0;			g.normal = half4(i.normal * 0.5 + 0.5, 1);			g.emission = col;#ifndef UNITY_HDR_ON			g.emission.rgb = exp2(-g.emission.rgb);#endif			return g;		}			ENDCG		}			Pass		{			Tags{ "LightMode" = "ShadowCaster" }			ZWrite On			ZTest LEqual			Offset 1, 1			CGPROGRAM			#pragma vertex vert_			#pragma fragment frag_			#pragma multi_compile_shadowcaster			struct a2v_ {			float4 vertex : POSITION;			float2 uv : TEXCOORD0;			float2 id : TEXCOORD1;			};			struct v2f_ {				V2F_SHADOW_CASTER;				float2 uv : TEXCOORD1;			};			v2f_ vert_(a2v_ v) {				Particle p = _Particles[GetID(v.id)];				v.vertex.xyz *= p.scale;				v.vertex.xyz += p.position;				v2f_ o;				o.pos = mul(UNITY_MATRIX_MVP, v.vertex);				o.uv = p.uv;				TRANSFER_SHADOW_CASTER(o)				return o;			}			float4 frag_(v2f_ i) : COLOR{				float4 col = tex2D(_MainTex,i.uv);				clip(col.a - 0.2);				SHADOW_CASTER_FRAGMENT(i)			}			ENDCG		}}FallBack "Diffuse"}
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
国产精品视频xxx| 欧美一区二区三区四区在线观看地址| 黄色av网址在线播放| 亚洲欧美一区二区三区不卡| 日日碰狠狠添天天爽| 欧美色图另类| 一个人看的www久久| 国内精品久久久久久久97牛牛| 麻豆传媒视频在线观看免费| 精品乱码一区二区三区| 日韩视频在线播放| 欧美黄色免费影院| 99re6热在线精品视频| 超碰在线国产97| 久久精品成人一区二区三区蜜臀| 青青青视频在线免费观看| 欧美激情精品在线| 久久国产精品视频| 亚洲激情五月| 精品亚洲成人| 欧美一级日本a级v片| 亚洲毛片播放| 国产精品老女人精品视频| 在线精品国产欧美| 国产精品毛片一区二区三区四区| av在线dvd| 成人污污视频在线观看| 永久免费在线观看| 美州a亚洲一视本频v色道| 欧美美女一区二区在线观看| 羞羞色午夜精品一区二区三区| 免费在线成人| 国产不卡视频在线| 日本福利小视频| 午夜国产福利一区二区| www.四虎在线| 91tv官网精品成人亚洲| 亚洲影视资源网| 国产精品豆花视频| www.av天天| 久久久亚洲精品石原莉奈| 欧美另类中文字幕| 国产又黄又猛又粗| 国产精品久久影视| 免费av片风间由美在线| 久久亚州av| 奇米精品一区二区三区在线观看| 日韩美女在线播放| av成人男女| 免费不卡中文字幕在线| 丰满岳乱妇一区二区三区| 亚洲精品狠狠操| 日本不卡视频| 91香蕉视频网址| 国内av免费观看| 精品日产卡一卡二卡麻豆| 中文字幕精品一区二区精品| 一个人免费观看在线视频www| 日韩av在线最新| 国产精品毛片a∨一区二区三区| 女人天堂在线| 日本桃色视频| 日本午夜视频在线观看| 国产精品一区二区三区精品| 欧美日韩国产精品一区二区三区| av午夜电影| 毛片在线免费播放| 激情丁香综合五月| 国产在线乱码一区二区三区| 999精品在线视频| 亚洲国产一区二区三区a毛片| 男女18免费网站视频| 日韩成人在线一区| 久久99精品波多结衣一区| 一区二区三区四区日韩| 日韩欧美国产综合在线一区二区三区| 亚洲熟妇无码av| 黄色的电影在线-骚虎影院-骚虎视频| 国产精品一区亚洲| 超碰在线首页| 欧美 日本 国产| 欧美三级华人主播| 欧洲一区二区在线| 精品国产免费人成网站| 精品日本美女福利在线观看| 丝袜美腿精品国产二区| 一个色综合网| eeuss影院在线观看| 国产成人一区二区在线观看| 久久久.com| 青青草成人在线| 亚洲不卡1区| 性一交一乱一乱一视频| 艳女tv在线观看国产一区| 国产按摩一区二区三区| 99产精品成人啪免费网站| 亚洲综合在线小说| 4480yy私人影院高清不卡| 国产成人精品视频ⅴa片软件竹菊| 久久久久久久国产精品| 亚洲精品视频自拍| 久久久久99人妻一区二区三区| 伊人久久亚洲影院| 你懂的视频在线播放| 日韩精品视频免费在线观看| 成人www视频网站免费观看| 欧美色图在线播放| 少妇大叫太大太粗太爽了a片小说| 国产午夜久久av| 精品视频97| 国产综合图区| 一区二区三区伦理片| 欧美国产精品劲爆| 9797在线看片亚洲精品| 91精彩刺激对白露脸偷拍| 国产精品极品美女在线观看免费| 一区二区三区欧美日韩| 日本欧美一区二区在线观看| 国产欧美日韩专区| 狠狠网亚洲精品| 一区在线视频观看| 日韩综合在线| 中文日本在线观看| 色欲av伊人久久大香线蕉影院| 一区二区三区少妇| 中文字幕免费在线观看| 曰本大片免费观看视频| 日韩欧美在线国产| 亚洲成人精品在线观看| 一区二区中文| 久久www成人_看片免费不卡| 国产成人综合一区二区三区| 亚洲另类激情图| 天海翼一区二区| 成人高清视频观看www| 欧美 日韩 国产 激情| 亚洲综合在线小说| 91免费视频网站| 亚洲老妇xxxxxx| www.国产精| 亚洲最大色综合成人av| 日韩电影二区| 任你操在线观看| 亚洲久草在线视频| 欧美女人性生活视频| 亚洲av无码不卡| 六月婷婷综合| 国产免费一区二区三区视频| 欧美精品一区二区蜜臀亚洲| 99精品欧美一区二区三区综合在线| 国产精品国产三级国产专播品爱网| 捆绑调教美女网站视频一区| 黄一区二区三区| 国模一区二区三区| 丝袜美腿中文字幕| 99精品欧美一区二区三区小说| 国产精品视频xxx| 影音先锋久久资源网| 91久久人澡人人添人人爽欧美| 国内自拍视频在线观看| 亚洲一级片免费观看| 国产理论在线观看| 日本精品性网站在线观看| 欧美老女人性开放| 久久久久9999亚洲精品| 国产色产综合产在线视频| 99re国产在线播放| 免费无码毛片一区二三区| 国产麻豆电影在线观看| 黄网站免费观看| 国产一区二区三区不卡av| 资源网第一页久久久| www.色视频| 日韩三级电影| 亚洲第一精品在线观看| 最近中文字幕在线免费观看| 成人免费观看www在线| 另类专区欧美| 久久只有这里有精品| 国产日产欧美一区二区视频| 日韩激情一区二区| h免费在线观看| 国产在线xxxx| 国产亚洲欧美一区| 国产日产亚洲精品系列| 91tv官网精品成人亚洲| www.九色.com| 国产做受69高潮| 亚洲国产第一| 国产一二在线观看| 精品小视频在线| 欧美性色黄大片手机版| 亚洲妇女屁股眼交7| 毛片aaaaaa| 国产精品自在在线| 日本激情一区二区| 丁香桃色午夜亚洲一区二区三区| 久久久9色精品国产一区二区三区| 精品一区二区在线免费观看| 欧美成人r级一区二区三区| 狠狠干狠狠搞| 怡春院在线视频| 欧美极品jizzhd欧美仙踪林| 永久免费黄色软件| 日产乱码一卡二卡三免费| 欧美午夜一区二区三区| 91精品国产成人观看| 岛国毛片av在线| 亚洲中文字幕在线一区| 一区二区三区视频在线看| 国产精品精品国产一区二区| 先锋影音男人av资源| 91美剧网在线播放| 欧美黑人狂野猛交老妇| 一区二区不卡视频在线观看| 91国语精品自产拍| 国产精品国产三级国产传播| 九九视频精品在线观看| 在线免费观看日本欧美| 日本成人7777| 成人在线视频亚洲| 国产在线视频欧美一区二区三区| 欧美性少妇18aaaa视频| 日本www在线播放| 18+视频在线观看| 91在线视频网址| 97精品国产97久久久久久春色| 日韩成人伦理电影在线观看| 在线免费国产视频| 国产精品亲子伦av一区二区三区| 麻豆网站视频在线观看| 欧美一级网址| 亚洲乱码国产乱码精品精大量| www.国产一区二区| 日本在线一区二区| 欧美日韩调教| 中日韩在线视频| 91超薄肉色丝袜交足高跟凉鞋| 懂色av一区二区在线播放| 波多野结衣一区二区三区在线| 三级精品视频久久久久| 青丝免费观看高清影视| 欧美三级欧美一级| 国产欧美一区二| theporn国产精品| 91深夜福利视频| 亚瑟国产精品| 手机在线观看国产精品| 国产亚洲视频系列| 欧美日韩国产综合视频在线观看中文| 56国语精品自产拍在线观看| 婷婷丁香六月天| 国产玉足榨精视频在线观看| 国产精品对白刺激| 日韩精品一区二区三区四区视频| 久久91亚洲精品中文字幕| 国产又大又长又粗又黄| 久久精品免费网站| 日韩avxxx| 亚洲精品一区二区三区精华液| 在线天堂中文字幕| 91国产在线播放| |精品福利一区二区三区| 西西人体44www大胆无码| 欧美一区二区三区公司| 国产午夜在线一区二区三区| 天堂va久久久噜噜噜久久va| 日本色七七影院| 欧美精品一区二区三区涩爱蜜| 国产精品一区二区电影| 亚洲色图偷拍自拍| 国产精品www在线观看| 国产色视频在线播放| 欧美日韩免费在线| 亚洲福利网站| 日韩欧美一区二区三区四区| 福利一区在线观看| 精品卡一卡二卡三卡四在线| 91精品麻豆| 欧美亚洲视频一区二区| 成年人视频网址| 日韩片电影在线免费观看| 久热re这里精品视频在线6| 91亚洲精品久久久蜜桃网站| 四虎永久国产精品| 波多野结衣小视频| 大桥未久av一区二区三区| 国产欧美丝祙| 国产真实乱对白精彩久久| 婷婷综合五月天| 国产jjizz一区二区三区视频| 中国美女乱淫免费看视频| 国产精品亚洲а∨天堂免在线| 日韩网站在线| 黄色网页在线免费看| 制服丝袜国产精品| 久久国产生活片100| av高清久久久| 99在线免费视频观看| www成人在线视频| 国产精品剧情一区二区在线观看| 女人天堂亚洲aⅴ在线观看| 国产成人精品久久二区二区| 最新中文字幕在线观看| 中文字幕一精品亚洲无线一区| 欧美激情性爽国产精品17p| 亚洲国产精品成人久久蜜臀| 九色国产视频| 国产日韩在线不卡| 成年网站免费在线观看| 欧美视频第二页| 久久都是精品| 99久久综合狠狠综合久久止| 免费在线观看国产精品| 丁香花高清在线观看完整版| 免费看一区二区三区| 亚洲精品精品亚洲| 精品久久影视| 国产精品网友自拍| 91麻豆精品在线| 国产成人一区二区三区小说| 国产一区二区在线看| 国产成人综合网| 久久精品导航| 国产精品区一区二区三| а√天堂资源官网在线资源| 欧美国产视频一区二区| 九色精品高清在线播放|