理解 Unity3D RenderWithShader Api
来源:互联网 发布:广告清理软件 编辑:程序博客网 时间:2024/05/19 17:59
主要参考:
unity, 替换shader渲染(Rendering with Replaced Shaders) :http://www.cnblogs.com/wantnon/p/4528677.html
测试例子:
Test.cs挂到Camera上
using UnityEngine;using System.Collections;public class Test1 : MonoBehaviour { private Camera shaderCamera; private RenderTexture replaceRenderTexture; public void Start() { shaderCamera = new GameObject("Test", typeof(Camera)).GetComponent<Camera>(); Camera origCamera = GetComponent<Camera>(); replaceRenderTexture = new RenderTexture((int)origCamera.pixelWidth, (int)origCamera.pixelHeight, 16, RenderTextureFormat.ARGB32); replaceRenderTexture.wrapMode = TextureWrapMode.Clamp; replaceRenderTexture.useMipMap = false; replaceRenderTexture.filterMode = FilterMode.Bilinear; replaceRenderTexture.Create(); } public void OnPreRender() { Camera origCamera = GetComponent<Camera>(); shaderCamera.CopyFrom(origCamera); //shaderCamera.backgroundColor = Color.clear; shaderCamera.clearFlags = CameraClearFlags.SolidColor; shaderCamera.renderingPath = RenderingPath.Forward; shaderCamera.targetTexture = replaceRenderTexture; shaderCamera.depth = 10; shaderCamera.RenderWithShader(Shader.Find("Unlit/blueSphere"), "RenderType"); }}
redAndGreen.shader
Shader "Unlit/redAndGreenSphere"{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Green" }LOD 100Pass{//Tags { "RenderType"="Green" }CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);UNITY_TRANSFER_FOG(o,o.vertex);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_MainTex, i.uv);// apply fogUNITY_APPLY_FOG(i.fogCoord, col);return fixed4(0, 0.5, 0, 1);}ENDCG}}SubShader{Tags { "RenderType"="Red" }LOD 100Pass{//Tags { "RenderType"="Red" }CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);UNITY_TRANSFER_FOG(o,o.vertex);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_MainTex, i.uv);// apply fogUNITY_APPLY_FOG(i.fogCoord, col);return fixed4(0.5, 0, 0, 1);}ENDCG}}}
blueSphere.shader
Shader "Unlit/blueSphere"{Properties{_MainTex ("Texture", 2D) = "white" {}}SubShader{Tags { "RenderType"="Green" }LOD 100Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag// make fog work#pragma multi_compile_fog#include "UnityCG.cginc"struct appdata{float4 vertex : POSITION;float2 uv : TEXCOORD0;};struct v2f{float2 uv : TEXCOORD0;UNITY_FOG_COORDS(1)float4 vertex : SV_POSITION;};sampler2D _MainTex;float4 _MainTex_ST;v2f vert (appdata v){v2f o;o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);o.uv = TRANSFORM_TEX(v.uv, _MainTex);UNITY_TRANSFER_FOG(o,o.vertex);return o;}fixed4 frag (v2f i) : SV_Target{// sample the texturefixed4 col = tex2D(_MainTex, i.uv);// apply fogUNITY_APPLY_FOG(i.fogCoord, col);//return col;return fixed4(0, 0, 0.5, 1);}ENDCG}}}
结论:
在shaderCamera 中,因为调用了RenderWithShader(Shader.Find("Unlit/blueSphere"), "RenderType");,因为blueSphere的SubShader的 "RenderType"="Green",所以,会在场景中进行寻找 第一个SubShader的"RenderType"="Green" 的物体,用blueSphere的SubShader来代替这些物体就进行渲染。
所以,上面的挂上了redAndGreen材质的球,本来是绿色,会用blueSphere.shader来渲染,渲染为蓝色。
0 0
- 理解 Unity3D RenderWithShader Api
- RenderWithShader坑
- Unity3D中Camera类的RenderWithShader方法和SetReplacementShader方法使用解析
- Unity RenderWithShader SetReplacementShader 的使用
- Unity3d中英文API
- Unity3d-C#常用API
- Unity3D API整理1
- unity3d 输入法相关API
- unity3d API汇总
- Unity3D API 知识点积累
- Unity3D常用API
- Unity3D SubMesh 个人理解
- [Unity3d] Unity3D 3.5寻路API简单介绍
- Unity3D 寻路API简单介绍
- Unity3D资源相关API介绍
- 【Unity3D】常用API学习笔记
- unity3d-WebCamTexture类API详解
- Unity3d-Resources.UnloadUnusedAssets初步理解
- Spark核心RDD理解
- H5前端性能测试快速入门
- DialogFrament遇到的两个坑
- Spark上的决策树(Decision Tree On Spark)
- 如何在线将pdf转换成图片格式
- 理解 Unity3D RenderWithShader Api
- JavaScript 数组
- 细谈select函数(C语言)
- CnCrypt代码 之 比较靠谱的临时驱动挂载和卸载方法
- 欧几里德算法和唯一分解定理
- 推免与开漏输出详解
- 收藏:ASP.NET提供文件下载函数(支持大文件、续传、速度限制、资源占用小) (转自: Arhrun)
- C++程序设计翻转课堂教学改革期末问卷统计
- NSOperationQueue 线程挂起,添加依赖