unity 代码修改shader能改默认的shader吗

想成为一个优秀的游戏程序员的我,如何才能快速入门Shader并用于开发,弥补我现在的最大不足? - 知乎385被浏览18612分享邀请回答262 条评论分享收藏感谢收起1039 条评论分享收藏感谢收起查看更多回答原地址:http://blog.csdn.net/huutu/article/details/?utm_source=tuicool&utm_medium=referral
在游戏中,怪物或者人受到攻击后,会有变白的效果。这个效果是Shader实现的。在判定被攻击的时候切换Shader。
[csharp]&&
[csharp]&&
代码没有问题,但是在4S等低端设备上,被攻击时会明显卡顿,时间长达1S。
于是用Unity的性能分析器,在被攻击时暂停,可以看到:
在OpenGL中用过Shader的同学们看到下面的函数名字就知道问题所在了&
Shader.CreateGPUProgram()
这个函数过程就是创建GLProgram链接Shader的一个过程,在Unity3d中的Shader.Find()是直接创建GLProgram的。
如果是自己去写引擎,GLProgram一般在初始化的时候就会创建完毕,然后用类似GLProgramManager管理。
Unity中的问题我们也可以用这个方法解决,但是Unity提供了简便方法。
点击Editor - Project Setting - Graphics&
右侧 Always Included Shaders,把我们需要使用的Shader拖到里面去吧
本文已收录于以下专栏:
相关文章推荐
在Unity中,我们在进行物体控制和交互过程中经常会涉及到动态改变Shader的情况,如将一个三维物体用网格显示、将三维物体的表现形式进行变更等等。
在Unity中主要通过MeshRenderer组...
实现Unity中动态天空昼夜交替等效果,懂的可以加云等天气变换
给模型动态替换shader的核心语句
Shader  newShader = Shader.Find(&Hero/HightLight&);
Material[] mats =...
定义一个材料,放在Resources文件夹中
然后贴上Shader代码Shader &Custom/ScriptControlShader& {
Properties {
_Color (&Co...
可以用SetPropertyBlock方式来实现多个物体共享材质,有部分属性略有不同的情况
这种方式被用在unity的地形上,里面的树就是通过这种方式实现不同树共用材质,
却可以有不同的颜色倾向,...
当我们写了一个动态的shader效果,在编辑器模式下查看它的效果,需要激活工具条上的Effect按钮。
using UnityE
using System.C
public class TestScriptReplaceShader : MonoBehaviour
版本:unity 5.4.1  语言:Unity Shader
Shader Forge版本:1.32
在具体介绍Shader之前准备再写一篇有关于ShaderForge的,虽然我们可能使...
原文地址:/tutorials/make-a-2d-game-with-unity3d-using-only-free-tools-part-...
前段时间总结了下CPU方面的优化,现在来谈谈同样重要的优化部分GPU,其主要会包括以下方面,之后会不断完善。在这里你要知道一点,GPU是负责分辨率的!
. 复杂的Shader
...
他的最新文章
讲师:刘文志
讲师:陈伟
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)【求助】请问shader可以改变物体一部分的颜色么?【unity3d吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:77,446贴子:
【求助】请问shader可以改变物体一部分的颜色么?收藏
比如想只改变平面上一个点的颜色,该修改shader代码里的哪一部分?默认情况好像是完全改变了,如果这样就跟直接定义材质球颜色没啥区别了啊
unity3d,亚马逊网上书城,满59元免运费,好书不间断!850多万种中外正版精品图书一网打尽!买unity3d,就上Z.CN!正版图书,天天低价特惠,让您挚爱阅读!
判断点的uv值就好了
mask贴图!显示区域白色!不显示黑色!或是模型的顶点色控制!上面那位的说法也行!通过世界坐标xy控制!方法很多种!看你具体想要的效果!
登录百度帐号推荐应用程序写累了,就来玩玩酷跑小游戏吧,嘿嘿。
雨松MOMO送你一首歌曲,嘿嘿。
Unity3D研究院之自制批量修改Shader插件(五十七)
Unity3D研究院之自制批量修改Shader插件(五十七)
围观22059次
编辑日期: 字体:
美工兄弟创建FBX模型带了好几十个贴图,每一个贴图都需要手动设置一下Shader,美工兄弟显然Hold不住了,作为一个程序帮他想想办法把,嘿嘿。我用了一下午的时间帮他写了一小插件。 如下图所示,ChangerShader是插件的代码,shader.txt是配置文件,把它俩都放在Editor文件夹中。
先看看shader.txt的配置文件,它就是配置批量修改Shader的列表,这里可以选择系统自带的Shader,也可以选择你自己创建的Shader,只要名称选择对就可以。配置文件Shader的你也可以继续添加,只要资源中有就可以。记住中间用& 字符隔开就可以,
Diffuse&&Mobile/Diffuse&&Transparent/Diffuse&&Mobile/Transparent/Vertex Color&&Custom/NewShader
Custom/NewShader是我自己创建的Shader。如下图所示,Shader的名称可以由你任意配置。
用法非常的简单,如下图所,在Hierarchy视图中选择需要批量修改的对象,然后在Unity导航菜单栏中选择Window-&ChangerShader。你可以放心选择对象,程序会自动检测你选择的对象是否可以修改Shader。
如下图所示,然后点击需要批量修改的Shader吧。在看看模型材质上的Shader,是不是很神奇,哇咔咔。。
目前这个小插件我在我的工程中已经完美测试通过,但是不代表没有一点BUG,MOMO希望大家多多使用给我提点意见。
ChangeShader.cs 插件的源码。 比较简单,我就不注释了。 核心就是根据Hierarchy视图中的游戏对象找到它的材质组件,如果组件中使用过Project视图中的资源文件的Shader文件,然后在Project中找到该资源文件的路径,最后获取这个资源对象并且修改它。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
using UnityEngine;using System.Collections;using UnityEditor;&public class ChangeShader :&&EditorWindow {&&&static TextAsset textAsset;&&static&&string [] lineArray;&& [MenuItem ("Window/ChangerShader")] &&&&static void AddWindow () {&&&&&&
textAsset = Resources.LoadAssetAtPath("Assets/Editor/shader.txt",typeof(TextAsset))as TextAsset;&
lineArray = textAsset.text.Split ("&"[0]);&
Rect&&wr = new Rect (0,0,500,500);&&&&&&&&ChangeShader window = (ChangeShader)EditorWindow.GetWindowWithRect (typeof (ChangeShader),wr,true,"widow name");
window.Show();&&&&&}& private Shader shader;& void OnGUI () {
for(int i =0; i&lineArray.Length; i++)
string shaderName = lineArray[i].Trim();
if(GUILayout.Button(shaderName))
Change(Shader.Find(shaderName));
} }& void Change(Shader shader) {
if(Selection.activeGameObject != null)
foreach(GameObject g in Selection.gameObjects)
Renderer []renders = g.GetComponentsInChildren&Renderer&();
foreach(Renderer r in renders)
if(r&&!=&&null)
foreach(Object o in r.sharedMaterials)
string path = AssetDatabase.GetAssetPath(o);
Material m = Resources.LoadAssetAtPath(path,typeof(Material)) as Material;
m.shader = shader;
this.ShowNotification(new GUIContent("选择的对象批量修改shader成功"));
this.ShowNotification(new GUIContent("没有在Hierarchy视图中选择对象"));&
批量修改完毕啦。哇咔咔
最后是本文的下载地址 祝大家学习愉快,啦啦啦~~~
本文固定链接:
转载请注明:
雨松MOMO提醒您:亲,如果您觉得本文不错,快快将这篇文章分享出去吧 。另外请点击网站顶部彩色广告或者捐赠支持本站发展,谢谢!
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
如果您愿意花10块钱请我喝一杯咖啡的话,请用手机扫描二维码即可通过支付宝直接向我捐款哦。
您可能还会对这些文章感兴趣!
Pingback 引用通告:
Pingback 引用通告:博客数据丢失,刚恢复一年前的备份!--QQ群:
初识Shader
首先。我们建立一个新的shader后。会有一段默认的代码。如下
Shader "小宝Shader/Test" {
//定义Shader属性
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
//这里定义子着色器(一个子着色器渲染draw call)
SubShader {
//渲染类型为Opaque,不透明
Tags { "RenderType"="Opaque" }
//开始着色器编程语言段
//使用兰伯特光照模式
#pragma surface surf Lambert
//变量声明
sampler2D _MainT
//输入结构
struct Input {
float2 uv_MainT
//函数的编写
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.
o.Alpha = c.a;
//结束着色器编程语言段
//“备胎”为普通漫反射 FallBack 音译为 “回滚”,俗称“备胎” 用来处理 设备老旧等导致Shader不能运行的情况
FallBack "Diffuse"
12345678910111213141516171819202122232425262728293031323334353637
Shader "小宝Shader/Test" { //定义Shader属性&& Properties {
_MainTex ("Base (RGB)", 2D) = "white" {} } //这里定义子着色器(一个子着色器渲染draw call) SubShader {
//渲染类型为Opaque,不透明
Tags { "RenderType"="Opaque" }
//开始着色器编程语言段
CGPROGRAM&
//使用兰伯特光照模式
#pragma surface surf Lambert&
//变量声明&&
sampler2D _MainTex;&
//输入结构
struct Input {
float2 uv_MainTex;
//函数的编写
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
o.Alpha = c.a;
//结束着色器编程语言段
//“备胎”为普通漫反射 FallBack 音译为 “回滚”,俗称“备胎” 用来处理 设备老旧等导致Shader不能运行的情况 FallBack "Diffuse"}
如上。命名为“小宝Shader/Test” 这样在选择Shader时会出现这个。如下
Shader "小宝Shader/Test"
Properties
_MainTex("基本纹理",2D)="White"{TexGen ObjectLinear}
//子着色器1
//设置纹理为属性中选择的纹理
SetTexture[_MainTex]{combine texture}
//备胎设为Unity自带的普通漫反射
Fallback" Diffuse "
12345678910111213141516171819202122232425
Shader "小宝Shader/Test"&&{&&&&&&&& //属性&&&&&& Properties&&&&&&&& {&&&&&&&&&&&&&&&&//纹理&& &&&&&&&&&&&&&&_MainTex("基本纹理",2D)="White"{TexGen ObjectLinear}&&&&&& &&&&&& }&&&& &&&&&& //子着色器1&&&&&& SubShader&&&&&&&& {&&&&&&&&&&&&&&&&//通道 &&&&&&&&&&&&&&Pass&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&& //设置纹理为属性中选择的纹理&& &&&&&&&&&&&&&&&&&&&& SetTexture[_MainTex]{combine texture}&&&&&&&&&&&&&&&&}&&&& &&&&&& }&&&& &&&&&&&&&&&& //备胎设为Unity自带的普通漫反射&& &&&&&& Fallback" Diffuse "&&}
之后的Shader都在这个基本框架下修改。
属性Properties
上面。我们了解了下Shader的基本结构。下面我们来了解下Properties属性。
我们在上面代码基础上。添加内容。在Properties添加如下属性
//定义Shader属性
Properties {
_MainTex("纹理&Texture", 2D) = "white" {}//贴图
_RimColor("边缘颜色&Rim Color", Color) = (0.17, 0.36, 0.81, 0.0)//颜色
_RimPower("颜色强度&Rim Power", Range(0.6, 9.0)) = 1.0//定义浮点数属性
//定义Shader属性&& Properties {
_MainTex("纹理&Texture", 2D) = "white" {}//贴图
_RimColor("边缘颜色&Rim Color", Color) = (0.17, 0.36, 0.81, 0.0)//颜色
_RimPower("颜色强度&Rim Power", Range(0.6, 9.0)) = 1.0//定义浮点数属性 }
我们来看Shader的效果。前修改后和修改前的对比。
Unity中使用Shader都是基于材质的。所以我们来新建要给材质并引用Shader。看看效果。如下:
这样。我们就能看到我们定义的属性。并且能修改值。但是由于我们用的默认的函数。只使用了贴图。故而只有贴图起效果了。颜色和浮点值不起效果。函数我们将在后面讲到。
最后。Properties属性定义命名规则
Properties { Property [Property …] }定义属性块,其中可包含多个属性,其定义如下
name (“display name“, Range (min, max)) = number
定义浮点数属性,在检视器中可通过一个标注最大最小值的滑条来修改。
name (“display name“, Color) = (number,number,number,number)
定义颜色属性
name (“display name“, 2D) = “name” { options }
定义2D纹理属性
name (“display name“, Rect) = “name” { options }
定义长方形(非2次方)纹理属性
name (“display name“, Cube) = “name” { options }
定义立方贴图纹理属性
name (“display name“, Float) = number
定义浮点数属性
name (“display name“, Vector) = (number,number,number,number)
定义一个四元素的容器(相当于Vector4)属性
name 为变量名称 每一个变量名称都必须在前面加_下划线(不要问我为什么,规定就是这样。);
(“display name” , variable)
“display name”为面板显示的名称 variable为变量的类型(类型如:Range(min,max),Color,2D,Rect,Cube,Float,Vector)
需要注意的是,包含在纹理属性的大括号中的选项Options是可选的。可能的选项有如下:
TexGen纹理生成类型。即纹理的自动生成纹理坐标时的模式,可以是ObjectLinear, EyeLinear,SphereMap, CubeReflect, CubeNormal的其中之一;这些模式和OpenGL纹理生成模式相对应。注意如果使用自定义顶点程序,那么纹理生成将被忽略。
系列链接传送门
转载请注明: &
or分享 (0)
本站所有内容如未标明转载的内容,均为原创内容。转载请注明来源!

我要回帖

更多关于 unity 2d默认shader 的文章

 

随机推荐