加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【风宇冲】Shader:六TexGen

(2012-12-23 08:58:26)
标签:

unity3d教程

unity3d插件

unity3d

unity

it

分类: Unity3d之Shader篇

原创文章如需转载请注明:转载自风宇冲博客


                     Shader第六讲:TexGen

介绍
TexGen全称是Texture coordinate generation,即纹理坐标生成。本来模型的纹理坐标是在做模型的时候赋予各个顶点的。但是有时模型表面非常复杂,或者要做一些特效时,就需要其他方法来生成纹理坐标。
TexGen主要用于Fixed Function Shader. 有如下模式ObjectLinearEyeLinearSphereMapCubeReflectCubeNormal . 
该函数直接对应OpenGL的texgen modes。

所有这些模式也可以用Vertex&Fragment实现同样的效果。
一 ObjectLinear: 

coord = P1*X + P2*Y + P3*Z + P4*W

xyzw即物体的本地坐标,P1–P4 为系数

4组结果分别对应OpenGL里的 S, T, R, Q,即 coord.xyzw

而通常的纹理映射只用到s,t  也就是x y

以正方体为例,中心点(0,0,0) x=0 y=0,对应贴图的(0,0)点也就是贴图的左下角

而右上角的前点(0.5,0.5,0.5)后点(0.5,0.5,-0.5)均对应贴图的(0.5,0.5)点也就是贴图的中心点。以此类推得到右下图的结果。

http://s3/mw690/47113292gd131843f5652&690

  1. Shader "Texgen" {
  2.     Properties {
  3.         _MainTex ("Base", 2D) = "white" { TexGen ObjectLinear }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combine texture }
  8. }
  9. }
  10. }

  1. Shader "Custom/Texgen_Obj_FragMine" {
  2.    Properties {
  3.         _MainTex ("Base"2D"white" 
  4.     }
  5.     SubShader {
  6.         Pass {
  7.             CGPROGRAM
  8.             #pragma vertex vert
  9.             #pragma fragment frag
  10.             #include "UnityCG.cginc"
  11.             sampler2D _MainTex;
  12.             float4 _MainTex_ST;
  13.             struct v2f {
  14.                 float4  pos SV_POSITION;
  15.                 float2  uv TEXCOORD0;
  16.            ;
  17.             v2f vert (appdata_base v)
  18.             {
  19.                 v2f o;
  20.                 o.pos mul(UNITY_MATRIX_MVP,v.vertex);
  21.                 o.uv v.vertex.xy;
  22.                 return o;
  23.             }
  24.             float4 frag (v2f iCOLOR
  25.             {
  26.                 float4 texCol tex2D(_MainTex,i.uv);
  27.                 return texCol;
  28.             }
  29.             ENDCG
  30.         }
  31.     }
  32. }

二 EyeLinear
与ObjectLinear类似,只是xyzw即物体 在摄像机坐标系下的坐标
  1. Shader "Texgen" {
  2.     Properties {
  3.         _MainTex ("Base", 2D) = "white" { TexGen EyeLinear }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combine texture }
  8. }
  9. }
  10. }

  1. Shader "Custom/Eye" {
  2.    Properties {
  3.         _MainTex ("Base"2D"white" 
  4.     }
  5.     SubShader {
  6.         Pass {
  7.             CGPROGRAM
  8.             #pragma vertex vert
  9.             #pragma fragment frag
  10.             #include "UnityCG.cginc"
  11.             sampler2D _MainTex;
  12.             float4 _MainTex_ST;
  13.             struct v2f {
  14.                 float4  pos SV_POSITION;
  15.                 float2  uv TEXCOORD0;
  16.            ;
  17.             v2f vert (appdata_base v)
  18.             {
  19.                 v2f o;
  20.                 o.pos mul(UNITY_MATRIX_MVP,v.vertex);
  21.                 o.uv =mul(UNITY_MATRIX_MV,v.vertex);
  22.                 return o;
  23.             }
  24.             float4 frag (v2f iCOLOR
  25.             {
  26.                 float4 texCol tex2D(_MainTex,i.uv);
  27.                 return outp;
  28.             }
  29.             ENDCG
  30.         }
  31.     }
  32. }

三 SphereMap
像镜子一样反射环境(此时这张纹理贴图相当于环境贴图)

  1. Shader "Texgen" {
  2.     Properties {
  3.   _Tex ("Cube", 2D) = "white" { TexGen SphereMap }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combine texture }
  8. }
  9. }
  10. }

四 CubeReflect
使用CubeMap(6面组成),像镜子一样反射环境(此时这张纹理贴图相当于环境贴图)
纹理坐标的xyz对应一条从Cubemap 中心射中的向量,穿过6面中某面的某点,该面该点周围的色素会被采样用以计算该碎片的最终颜色值。


  1. Shader "Texgen" {
  2.     Properties {
  3.    _Tex ("Cube", Cube) = "white" { TexGen CubeReflect }
  4.     }
  5. SubShader {
  6. Pass {
  7. SetTexture [_MainTex] { combine texture }
  8. }
  9. }
  10. }

五 CubeNormal
使用CubeMap,显示天空盒,广泛使用的就不多说了。



0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有