グラフィックスとか数学…etc

勉強したことのまとめを書きます~.Qiitaはこちら→http://qiita.com/muripo_life

UnityのShaderのことはじめ_#001_Shaderの種類、Shaderでアニメーションを作る!

今回の主題は2つです。

  • Shaderの種類
  • Shaderでアニメーションを作成

の二つの内容です。

Shaderの種類

Shaderには

  1. サーフェイスシェーダ(Surface Shader)
  2. 頂点 / フラグメントシェーダ(Vertex / Fragment Shader)
  3. 固定関数シェーダ(Fixed Function Shader)

と3種類ある。

サーフェイスシェーダ(Surface Shader)

言語:Cg/HLSL

ライティングなどをUnity側でよしなにしてくれるタイプのシェーダ

この

ブログでは、今のところこれをメインに書こうと思っています。

頂点 / フラグメントシェーダ(Vertex / Fragment Shader)

言語:Cg/HLSL

頂点シェーダ/フラグメントシェーダは、普通のプログラマブルシェーダです。

これも触れるのかな?

固定関数シェーダ(Fixed Function Shader)

言語:ShaderLab

シェーダをサポートしていない端末の場合に利用されるもので、基本は使わないものらしい?

以上

Shaderでアニメーションを作成

実は、前回のっけたコードはアニメーションつきでして!

その説明を詳しくしていこうと思います。

アニメーションを作るには!

ずばり「_Time.x」を使えばいい!!

ちなみに

  • _Time.x:t/20[秒]
  • _Time.y:t[秒]
  • _Time.z:2×t[秒]
  • _Time.w:3×t[秒]

だったりします。

早速うごかす!

 

f:id:ltqhon:20151001233551p:plain

f:id:ltqhon:20151001233742p:plain

ソース

Shader "Example/Shader_ani" {
Properties{
_DiffuseColor("Diffuse Color",Color)=(0.0,0.0,1.0)
}

SubShader {
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma surface surf Lambert vertex:vert
struct Input {
float4 color : COLOR;
float3 viewDir;
};
float4 _DiffuseColor;
void vert (inout appdata_full v) {
v.vertex.x +=v.normal.x * -sin((v.vertex.y+_Time.w) * 3.14);
v.vertex.z +=v.normal.x * -sin((v.vertex.y) * 3.14);
}
void surf (Input IN, inout SurfaceOutput o) {
o.Albedo = _DiffuseColor;
}
ENDCG
}
Fallback "Diffuse"
}

 

UnityのShaderのことはじめ_#000_Shaderを書く方法

UnityのShaderのことはじめについて

UnityのShaderについて、ど素人?の僕が一からShaderを調べて書いていこうと思う趣旨の記事です。

個人的にグラフィックススキル

  • 大学の学部生の時に、openFrameworksを半年間書いていたことがある。
  • 学部の頃の授業で一度だけOpenGLを触った!
  • エンジンは忘れたが、3Dシミュレーションのマイナーなフレームワークでコーディングした経験がある。
  • 学部2年の時、4年のゼミに混じって『ゲームプログラミングのための3Dグラフィックス数学』という書籍を読んでいた。
  • 補足:大学は学部・院(非情報系、研究でPCはLatexしか使っていない!)

なぜ、Shaderを?

数式で細かく、図形を弄りたいから!

 

ということで、身近に使っている。Unityからできるものはないかと思いShaderを始めました。

 

Shaderを動かしてみよう!

Shaderの動かし方は簡単!

  1. Unityを起動する!
  2. プロジェクトを作る!
  3. Sceneを作る!(ちなみに次からが本番!)
  4. Projectビューの中で右クリックをし、Shaderを作成!

    f:id:ltqhon:20150929002714p:plain

  5. 作成したShaderをダブルクリックで起動

    f:id:ltqhon:20150929003247p:plain

  6. 適当にコード張る。ソースの内容

    Shader "Custom/tic" {
    Properties {
    _DiffuseColor("Diffuse Color",Color)=(0.0,0.0,1.0)
    }
    SubShader {
    Tags { "RenderType"="Opaque" }
    CGPROGRAM
    #pragma surface surf Lambert vertex:vert
    struct Input {
    float4 color : COLOR;
    float3 viewDir;
    };
    float4 _DiffuseColor;
    void vert (inout appdata_full v) {

    v.vertex.y += 3 *abs(sin(_Time.x*1000));

    }
    void surf (Input IN, inout SurfaceOutput o) {
    o.Albedo = _DiffuseColor;
    }
    ENDCG
    }
    Fallback "Diffuse"
    }

  7. Projectビューの中で右クリックをし、Materialを作成!

    f:id:ltqhon:20150929003426p:plain

  8. MaterialのにShaderをドラックアンドドロップ
  9. HierarchyビューのCreateから3D Objectで「Sphere」、「Capsule」、「Cylinder」のいずれかを作成

    f:id:ltqhon:20150929004045p:plain

  10. Inspectorビューの「Mash Renderer」の中の「Materials」を展開し、8のMaterialをドラックアンドドロップ

    f:id:ltqhon:20150929004430p:plain

  11.  

    再生以上!