基础贴图Shader:只有纹理

1. 在属性中声明纹理贴图: _MainTex ("Texture", 2D) = "white" {}

2. 在Pass中声明变量: sampler2D _MainTex; float4 _MainTex_ST; 这个是成对出现,_MainTex_ST 用与计算坐标偏移offset

3. 在Vertex Function函数中进行纹理坐标采样: o.tex = v.texcoord;

4. 在Fragment Function 函数中采样纹理,并输出: float4 tex = tex2D(_MainTex,i.tex.xy*_MainTex_ST.xy+_MainTex_ST.zw); return float4(tex);

源代码:

  1. Shader "Unlit/Textures_Base"
  2. {
  3. Properties
  4. {
  5. _MainTex ("Texture", 2D) = "white" {}
  6. }
  7. SubShader
  8. {
  9. Pass
  10. {
  11. CGPROGRAM
  12. #pragma vertex vert
  13. #pragma fragment frag
  14.  
  15. #include "UnityCG.cginc"
  16.  
  17. sampler2D _MainTex;
  18. float4 _MainTex_ST;
  19.  
  20. //输入结构体
  21. struct vertexInput{
  22. float4 vertex:POSITION;
  23. float4 texcoord:TEXCOORD0;
  24. };
  25.  
  26. //输出结构体
  27. struct vertexOutput{
  28. float4 pos:SV_POSITION;
  29. float4 tex:TEXCOORD0;
  30. };
  31.  
  32. vertexOutput vert (vertexInput v)
  33. {
  34. vertexOutput o;
  35.  
  36. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
  37. o.tex = v.texcoord;
  38.  
  39. return o;
  40. }
  41.  
  42. fixed4 frag (vertexOutput i) : COLOR
  43. {
  44. //Texture Map
  45. float4 tex = tex2D(_MainTex,i.tex.xy*_MainTex_ST.xy+_MainTex_ST.zw);
  46. return float4(tex);
  47. }
  48. ENDCG
  49. }
  50. }
  51. }

纹理(Texture)+高光(Specular)+边缘光(Rim)+漫反射(diffuse)+环境光(ambient)+多光源(Lighting)(1个平行光,1个点光源):

源代码:

  1. Shader "JQM/Textures"
  2. {
  3. Properties
  4. {
  5. _Color("Color", color) = (1.0,1.0,1.0,1.0)
  6. _MainTex ("Texture", 2D) = "white" {}
  7. _SpecColor("Specular Color", color) = (1.0,1.0,1.0,1.0)
  8. _Shininess("Shininess",float) =
  9. _RimColor("Rim Coloe Color", color) = (1.0,1.0,1.0,1.0)
  10. _RimPower("Rim Power",Range(0.1,10.0)) = 3.0
  11. }
  12.  
  13. SubShader
  14. {
  15.  
  16. Pass
  17. {
  18. Tags { "LightMode"="ForwardBase" }
  19.  
  20. CGPROGRAM
  21. #pragma vertex vert
  22. #pragma fragment frag
  23. //#pragma exclude_renderers flash //给指定平台编译
  24.  
  25. #include "UnityCG.cginc"
  26.  
  27. //使用自定义变量
  28. sampler2D _MainTex;
  29. float4 _MainTex_ST;
  30. uniform float4 _Color;
  31. uniform float4 _SpecColor;
  32. uniform float4 _RimColor;
  33. uniform float _Shininess;
  34. uniform float _RimPower;
  35.  
  36. //使用Unity定义的变量
  37. uniform float4 _LightColor0;
  38.  
  39. //输入结构体
  40. struct vertexInput{
  41. float4 vertex:POSITION;
  42. float3 normal:NORMAL;
  43. float4 texcoord:TEXCOORD0;
  44. };
  45.  
  46. //输出结构体
  47. struct vertexOutput{
  48. float4 pos:SV_POSITION;
  49. float4 tex:TEXCOORD0;
  50. float4 posWorld:TEXCOORD1;
  51. float3 normalDir:TEXCOORD2;
  52. };
  53.  
  54. vertexOutput vert (vertexInput v)
  55. {
  56. vertexOutput o;
  57.  
  58. o.posWorld = mul(_Object2World, v.vertex);
  59. o.normalDir = normalize( mul(float4(v.normal,0.0),_World2Object).xyz);
  60. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
  61. o.tex = v.texcoord;
  62.  
  63. return o;
  64. }
  65.  
  66. fixed4 frag (vertexOutput i) : COLOR
  67. {
  68. float3 normalDirection = i.normalDir;
  69. float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz- i.posWorld.xyz);
  70. float3 lightDirection;
  71. float atten;
  72.  
  73. if(_WorldSpaceLightPos0.w==0.0)//平行光
  74. {
  75. atten = 1.0;
  76. lightDirection = normalize(_WorldSpaceLightPos0.xyz);
  77. }
  78. else
  79. {
  80. float3 fragmentToLightSource = _WorldSpaceLightPos0.xyz -i.posWorld.xyz;
  81. float distance = length(fragmentToLightSource);
  82. atten = 1.0/distance;
  83. lightDirection = normalize(fragmentToLightSource);
  84. }
  85.  
  86. //灯光
  87. float3 diffuseReflection = atten * _LightColor0.xyz * saturate( dot(normalDirection,lightDirection));
  88. float3 specularReflection = atten * _LightColor0.xyz * _SpecColor.rgb*saturate( dot(normalDirection,lightDirection))*pow(saturate(dot(reflect(-lightDirection,normalDirection),viewDirection)),_Shininess);
  89.  
  90. //Rim Light
  91. float rim= -dot(normalize(viewDirection),normalDirection);
  92. float3 rimLighting = atten * _LightColor0.xyz * _RimColor.rgb*saturate(dot(normalDirection,lightDirection))*pow(rim,_RimPower);
  93.  
  94. float3 lightFinal = rimLighting + diffuseReflection+specularReflection+UNITY_LIGHTMODEL_AMBIENT.xyz;
  95.  
  96. //Texture Map
  97. float4 tex = tex2D(_MainTex,i.tex.xy*_MainTex_ST.xy+_MainTex_ST.zw);
  98. return float4(tex*lightFinal*_Color.xyz,1.0);
  99.  
  100. }
  101. ENDCG
  102. }
  103.  
  104. Pass
  105. {
  106. Tags { "LightMode"="ForwardAdd" }
  107. Blend One One
  108.  
  109. CGPROGRAM
  110. #pragma vertex vert
  111. #pragma fragment frag
  112. //#pragma exclude_renderers flash //给指定平台编译
  113.  
  114. #include "UnityCG.cginc"
  115.  
  116. //使用自定义变量
  117. sampler2D _MainTex;
  118. float4 _MainTex_ST;
  119. uniform float4 _Color;
  120. uniform float4 _SpecColor;
  121. uniform float4 _RimColor;
  122. uniform float _Shininess;
  123. uniform float _RimPower;
  124.  
  125. //使用Unity定义的变量
  126. uniform float4 _LightColor0;
  127.  
  128. //输入结构体
  129. struct vertexInput{
  130. float4 vertex:POSITION;
  131. float3 normal:NORMAL;
  132. float4 texcoord:TEXCOORD0;
  133. };
  134.  
  135. //输出结构体
  136. struct vertexOutput{
  137. float4 pos:SV_POSITION;
  138. float4 tex:TEXCOORD0;
  139. float4 posWorld:TEXCOORD1;
  140. float3 normalDir:TEXCOORD2;
  141. };
  142.  
  143. vertexOutput vert (vertexInput v)
  144. {
  145. vertexOutput o;
  146.  
  147. o.posWorld = mul(_Object2World, v.vertex);
  148. o.normalDir = normalize( mul(float4(v.normal,0.0),_World2Object).xyz);
  149. o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
  150. o.tex = v.texcoord;
  151.  
  152. return o;
  153. }
  154.  
  155. fixed4 frag (vertexOutput i) : COLOR
  156. {
  157. float3 normalDirection = i.normalDir;
  158. float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz- i.posWorld.xyz);
  159. float3 lightDirection;
  160. float atten;
  161.  
  162. if(_WorldSpaceLightPos0.w==0.0)//平行光
  163. {
  164. atten = 1.0;
  165. lightDirection = normalize(_WorldSpaceLightPos0.xyz);
  166. }
  167. else
  168. {
  169. float3 fragmentToLightSource = _WorldSpaceLightPos0.xyz -i.posWorld.xyz;
  170. float distance = length(fragmentToLightSource);
  171. atten = 1.0/distance;
  172. lightDirection = normalize(fragmentToLightSource);
  173. }
  174.  
  175. //灯光
  176. float3 diffuseReflection = atten * _LightColor0.xyz * saturate( dot(normalDirection,lightDirection));
  177. float3 specularReflection = atten * _LightColor0.xyz * _SpecColor.rgb*saturate( dot(normalDirection,lightDirection))*pow(saturate(dot(reflect(-lightDirection,normalDirection),viewDirection)),_Shininess);
  178.  
  179. //Rim Light
  180. float rim= -dot(normalize(viewDirection),normalDirection);
  181. float3 rimLighting = atten * _LightColor0.xyz * _RimColor.rgb*saturate(dot(normalDirection,lightDirection))*pow(rim,_RimPower);
  182.  
  183. float3 lightFinal = rimLighting + diffuseReflection+specularReflection+UNITY_LIGHTMODEL_AMBIENT.xyz;
  184.  
  185. //Texture Map
  186. float4 tex = tex2D(_MainTex,i.tex.xy*_MainTex_ST.xy+_MainTex_ST.zw);
  187. return float4(tex*lightFinal*_Color.xyz,1.0);
  188.  
  189. }
  190. ENDCG
  191. }
  192. }
  193. }

Texture 纹理贴图的更多相关文章

  1. IOS 中openGL使用教程3(openGL ES 入门篇 | 纹理贴图(texture)使用)

    在这篇文章中,我们将学习如何在openGL中使用纹理贴图. penGL中纹理可以分为1D,2D和3D纹理,我们在绑定纹理对象的时候需要指定纹理的种类.由于本文将以一张图片为例,因此我们为我们的纹理对象 ...

  2. android ndk调用OpenGL 实现纹理贴图Texture

    android ndk调用OpenGL 实现纹理贴图Texture 时间 2014-06-25 05:24:39  CSDN博客 原文  http://blog.csdn.net/chrisfxs/a ...

  3. OpenGL入门1.4:纹理/贴图Texture

    每一个小步骤的源码都放在了Github 的内容为插入注释,可以先跳过 前言 游戏玩家对Texture这个词应该不陌生,我们已经知道了怎么为每个顶点添加颜色来增加图形的细节,但,如果想让图形看起来更真实 ...

  4. [Unity] Shader(着色器)之纹理贴图

    在Shader中,我们除了可以设定各种光线处理外,还可以增加纹理贴图. 使用 settexture 命令可以为着色器指定纹理. 示例代码: Shader "Sbin/ff2" { ...

  5. Unity3D ShaderLab压缩混合纹理贴图

    Unity3D ShaderLab压缩混合纹理贴图 纹理可以用于存储大量的数据,我们可以把多个图像打包存储在单一的RGBA纹理上,然后通过着色器代码提取这些元素, 我们就可以使用每个图片的RGBA通道 ...

  6. OpenGL 纹理贴图

    前一节实例代码中有个贴图操作. 今天就简单说明一下纹理贴图... 为了使用纹理贴图.我们首先需要启用纹理贴图功能. 我们可以在Renderer实现的onSurfaceCreated中定义启用: // ...

  7. Directx11学习笔记【十七】纹理贴图

    本文由zhangbaochong原创,转载请注明出处http://www.cnblogs.com/zhangbaochong/p/5596180.html 在之前的例子中,我们实现了光照和材质使得场景 ...

  8. Android OpenGL ES 开发(九): OpenGL ES 纹理贴图

    一.概念 一般说来,纹理是表示物体表面的一幅或几幅二维图形,也称纹理贴图(texture).当把纹理按照特定的方式映射到物体表面上的时候,能使物体看上去更加真实.当前流行的图形系统中,纹理绘制已经成为 ...

  9. WebGL学习之纹理贴图

    为了使图形能获得接近于真实物体的材质效果,一般会使用贴图,贴图类型主要包括两种:漫反射贴图和镜面高光贴图.其中漫反射贴图可以同时实现漫反射光和环境光的效果. 实际效果请看demo:纹理贴图 2D纹理 ...

随机推荐

  1. JAVA启动参数三:非Stable参数

    前面我们提到用-XX作为前缀的参数列表在jvm中可能是不健壮的,SUN也不推荐使用,后续可能会在没有通知的情况下就直接取消了:但是由于这些参数中的确有很多是对我们很有用的,比如我们经常会见到的-XX: ...

  2. [CF Round #278] Tourists

    给定一个n个点m条边的无向图,求图上的两点的所有的简单路径之间的最小边. 蓝链 $ n,m,q \leq 100000, w_i \leq 10 ^7$ Solution 考虑建立用缩点双来建立广义圆 ...

  3. 水题 Gym 100553K Knockout Racing

    题目传送门 /* 题意:有若干个点在一个区间内来回移动,1m/s. 水题:n^2的复杂度能解决,注意时间可能大于一个周期,要取模 */ #include <cstdio> #include ...

  4. 题解报告:hdu 1203 I NEED A OFFER!(01背包)

    Problem Description Speakless很早就想出国,现在他已经考完了所有需要的考试,准备了所有要准备的材料,于是,便需要去申请学校了.要申请国外的任何大学,你都要交纳一定的申请费用 ...

  5. .vimrc文件配置及含意

    1.  vimrc文件常见语句释义 设定 tab 的位置          :set tabstop=4 输入 tab 时自动将其转化为空格          :set expandtab       ...

  6. LN : leetcode 413 Arithmetic Slices

    lc 413 Arithmetic Slices 413 Arithmetic Slices A sequence of number is called arithmetic if it consi ...

  7. 微软2017年预科生计划在线编程笔试 A Legendary Items

    思路: 获得第i(i = 0, 1, ..., n - 1)件物品的概率仅由公式p / (1 << i)决定,所以获得这i件物品之间是相互独立的.迭代计算获得所有i件物品的期望再求和即可. ...

  8. vue-element:文件上传七牛之key和异步的问题

    效果图: html 代码: <el-form-item label="Excel文件" :label-width="formLabelWidth" pro ...

  9. Delphi win10 asssertion failure

    Delphi2007 原来安装在Win7 下 运行正常, 自从升级到Win10 ,新建工程运行然后关闭报错, 报错信息如下: ---------------------------bds.exe - ...

  10. Harris角点检测原理详解

    http://blog.csdn.net/lwzkiller/article/details/54633670 关于角点的应用在图像处理上比较广泛,如图像匹配(FPM特征点匹配).相机标定等.网上也有 ...