twitter.comGoogle Keepが日本語OCRに対応した模様。あとは引越しツールが出るのを待ってEvernoteから移住だな。#Tech pic.twitter.com/M2qESoxuLx
— 植田達郎@疲労困憊 (@weed_7777) 2017年11月28日
特定のメッシュの色を変えるシェーダプログラミング、おまじないを省いたコード付き
おまじないを省いたコード
Shader "Custom/MyShader53-2" { customData = sin(v.vertex.y + _Time.x * 20); color += float4(1.0, 0.0, 0.0, 1.0) * customData; o.Albedo = tex2D(uv_Texture).rgb; }
全コード
Shader "Custom/MyShader53-2" { Properties { _Taxture( "Texture", 2D ) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Lambert finalcolor:mycolor vertex:myvert struct Input { float2 uv_Texture; float customData; }; sampler2D _Taxture; void myvert( inout appdata_full v, out Input data ) { UNITY_INITIALIZE_OUTPUT(Input, data); data.customData = sin(v.vertex.y + _Time.x * 20); } void mycolor(Input IN, SurfaceOutput o, inout fixed4 color) { color += float4(1.0, 0.0, 0.0, 1.0) * IN.customData; } void surf (Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_Taxture, IN.uv_Texture).rgb; } ENDCG } FallBack "Diffuse" }
シェーダで色を変更する、おまじないを省いたコード付き
緑と青をうっすらと塗ります。
おまじないを省いたコード
Shader "Custom/MyVertexShader4" { color += float4(0.0, 0.5, 0.5, 1.0); }
コード全体
Shader "Custom/MyVertexShader4" { Properties { _Texture("Texture", 2D) = "white" {} } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Lambert finalcolor:mycolor struct Input { float2 uv_Texture; }; sampler2D _Texture; void mycolor(Input IN, SurfaceOutput o, inout fixed4 color) { color += float4(0.0, 0.5, 0.5, 1.0); } void surf(Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_Texture, IN.uv_Texture).rgb; } ENDCG } FallBack "Diffuse" }
頂点シェーダに挑戦、おまじないを省いたコード付き
各頂点のx座標を3、y座標を3増やすような頂点シェーダを書いてみます。
おまじないを省いたコード
Shader "Custom/MyVertexShader3" { v.vertex.x += 3; v.vertex.z += 3; }
おまじないを含んだコード
Shader "Custom/MyVertexShader3" { Properties { _DiffuseColor("Diffuse Color", Color) = (1.0, 1.0, 1.0) } SubShader { Tags { "RenderType"="Opaque" } CGPROGRAM #pragma surface surf Lambert vertex:vert struct Input { float4 color: COLOR; }; float3 _DiffuseColor; void vert(inout appdata_full v) { v.vertex.x += 3; v.vertex.z += 3; } void surf(Input IN, inout SurfaceOutput o) { o.Albedo = _DiffuseColor; } ENDCG } FallBack "Diffuse" }
シェーダからおまじないを取り除いた裸のコードはシンプルだった
Unityのシェーダの勉強を始めました。
まず、シェーダを書くにはSublime TextでShaderLangageというパッケージを入れるとSyntaxHighlightされて書きやすいです。
さて、最初に勉強するシェーダのコードはほとんどがおまじないだとわかりました。
例えば以下のコード。
Shader "Custom/MyShader" { SubShader{ // おまじない Tags{ // おまじない "RenderType" = "Opaque" // おまじない } CGPROGRAM // おまじない #pragma surface surf Lambert // おまじない struct Input { // おまじない float4 color : COLOR; // おまじない }; void surf(Input IN, inout SurfaceOutput o) { // おまじない o.Albedo = half3(1.0, 0.5, 0.4); } ENDCG // おまじない } }
つまり、以下のようになります。
Shader "Custom/MyShader" { o.Albedo = half3(1.0, 0.5, 0.4); }
halfというのはデータの型で、以下のページに一覧が載っています。
以下引用です:
高精度: float
float は最高精度の浮動小数点値で、通常のプログラミング言語の float と同じように一般な 32 ビットです。
ワールド空間位置、テクスチャ座標、複雑な関数を含むスカラー計算 (三角法、累乗法など) には、 たいてい 32 ビットの float が使用されます。
中精度: half
half は中精度の浮動小数点値で、一般に 16 ビットです (–60000 から +60000 の範囲で、小数点以下約 3 桁)。
Half は、ショートベクトル、方向、オブジェクト空間位置、HDR カラー に使用されます。
低精度: fixed
fixed は低精度で、固定小数点数です。一般的に 11 ビットで、–2.0 から +2.0 の範囲で、1/256 精度です。
固定精度は、標準カラー (一般的に標準テクスチャに保管されるので) とそれらの単純な制御に使用されます。
おお、これなら俺でもわかる。とにかくも一歩前進。