• DoRubyとは
  • お問い合わせ
  • Ruby/Rails
  • Web開発
  • Webマーケティング
  • アピリッツ
  • ライフハック
  • ゲーム制作/開発
  • Railsの小技
  • Rubyの小技
  • Gemの紹介
  • ActiveRecord
  • 初心者向け
  • Java/Scalaテク
  • Unixのあれこれ
  • データベース
  • スマホ開発
  • HTML/CSS/JavaScript
  • デザイン製作
  • インフラ
  • クラウド
  • セキュリティ
  • エディタ
  • バージョン管理
  • その他
  • python
  • アクセス解析
  • Googleアナリティクス
  • Googleデータスタジオ
  • Web広告
  • SEO
  • UI/UX
  • ソーシャルメディア
  • EC開発
  • Webシステム開発
  • コンサルティング
  • Webデザイン
  • ブロックチェーン
  • ゲーム紹介
  • アプリ紹介
  • ASP
  • 風景
  • パソコン
  • ツール
  • ガジェット
  • 仕事術
  • 健康
  • 生活
  • 書評
  • Excel(エクセル)
  • PowerPoint(パワーポイント)
  • ゲームプランニング
  • SpriteStudio
  • マスターデータ入力/作成
  • Unity
  • キャラクターデザイン
  • ゲームシナリオ
  • レベルデザイン
  • ゲーム分析
  • 3DCG
  • イラスト制作
  • CG/アニメーション
  1. ホーム
  2. ゲーム制作/開発
  3. Unity
  4. Unityのシェーダーについて
  • 2018-04-02
    • カテゴリ:
    • Unity

Unityのシェーダーについて

この記事は公開から1年以上が経過しています。情報が古い可能性がありますのでご注意ください。

Unityのシェーダーについて自分で調べたことをまとめました。

はじめに

どうもmotsuka です。
今回はシェーダーを書いてみたくなったのでいろいろと調べてみたことをまとめてみたいと思います。

シェーダーとは

シェーダーとはシェーディング処理(陰影処理)を行うプログラムのことで、オブジェクトの頂点や色を変えるプログラムのことを指します。ポリゴンやテクスチャ等の画像をどのように画面に表示するかを決めるプログラムです。

またUnityでは3つのシェーダーがあり、

  • 固定関数シェーダー
  • サーフェイスシェーダー
  • 頂点フラグメントシェーダー

Unityでシェーダーを書くときこれらを使い分けて書く必要があります。
これらを簡単に説明すると

  • 固定関数シェーダー
    これはプログラマブルシェーダーをサポートしていない古いハードウェア用のシェーダーです。またこのシェーダーは後述のPass句のみからなるシェーダになります。

  • サーフェイスシェーダー
    影やライティングを扱うときに書くシェーダーです。

  • 頂点フラグメントシェーダー
    オブジェクトの頂点を変更したあとに色を変更することのできるシェーダーです。子のシェーダーでは結構複雑なエフェクトなどを表現するときに使用します。

これらUnityで動くすべてのシェーダーでShaderLabという書式で書かれます。
これらの項目はまとめにURLが書いてあるので詳しく読みたい方はそちらをご覧ください。

サンプルコード

では、簡単なシェーダーを書いてみましょう

今回は簡単な例として画面上に置かれた立方体の色を変えるプログラムを書いていきたいと思います。

まず、プロジェクト内で右クリックをして Create -> Shader -> Standard Surface Shaderをクリックしてシェーダーを作ります。
それをテキストエディタで開いてみましょう。

Shader "Custom/Test" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
       CGPROGRAM
       #pragma surface surf Standard fullforwardshadows
        #pragma target 3.0
        sampler2D _MainTex;
        struct Input {
            float2 uv_MainTex;
        };
        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        UNITY_INSTANCING_BUFFER_START(Props)
        UNITY_INSTANCING_BUFFER_END(Props)
        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            o.Albedo = c.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Diffuse" }

上のようなソースができたと思います。
上から読んでいきましょう
大きく分けて二つの枠に分けることができます。

  • Properties
    ここにはUnity側からシェーダーに渡したいものを記述します。
    簡単に言うと変数宣言の場所と思ってください。
    Unity側からのデータを任意の名前を付けて使えるようにする場所です。
    このソースでは、色のデータや表面のテクスチャなどのデータを渡しています。
    この項目はインスペクター上に表示され変更することができるものになります。

  • SubShader
    ここには実際にシェーダーの中身を書いていく場所です。
    CGPROGRAMが処理の始まりを示していて、ENDCGが処理の終わりを示しています。
    この句のメインの処理はsurf関数です。
    ここではinputをうけとり様々な処理をしてSurfaceOutputStandardに詰めるという処理になっています。またinputに何が渡ってくるかはその上に書いてあるstructにて記述してあります。

ではこのソースを変えてこのシェーダーがついているオブジェクトの色を変えましょう。

_Color ("Color", Color) = (1,1,1,1)

の行を下のように書き換えます。

_Color ("Color", Color) = (1,0,0,1)

に変えて保存したシェーダーからマテリアルをつくって適当なオブジェクトにアタッチしてみてください。
そうすると色が赤色に変わったことが確認できます。

まとめ

書いたことがなかったシェーダーですが、やってみるとあまり難しくなくさっくりとできる印象ですので皆さんもやってみてはいかがでしょうか?ですが、C#とは全く違う書き方や最初はよくわからないパラメータが多く出てくるので最初はきついかもしれませんが、慣れるとすんなり読めるようになるので皆さんもシェーダーを書いてみましょう。
次は文字のアウトラインをシェーダーで書いてみたいですね。余裕があったらまた書きたいと思います。
参考にしたURLを下にのせておくのでそこから読んでもらうと理解がより深まると思います。

Unity Documentation シェーダーマニュアル
https://docs.unity3d.com/ja/current/Manual/ShadersOverview.html

Unity のシェーダの基礎を勉強してみたのでやる気出してまとめてみた
http://tips.hecomi.com/entry/2014/03/16/233943


  • 711 views
    • Tweet
    • このエントリーをはてなブックマークに追加

この記事を書いた人
motsuka
2017年新卒のエンジニア

「いいね!」するとDoRubyの最新記事を受け取ることができます。

Facebook

Twitterから最新記事を受け取るならこちら

Follow @doruby

Feedlyから最新記事を受け取るならこちら

follow us in feedly

おすすめの記事
  • 771 views
  • 2018-06-13
おすすめのAfterEffects無料エフェクトプラグイン紹介
  • 711 views
  • 2018-04-02
Unityのシェーダーについて
  • 2,334 views
  • 2018-01-31
塗りにひと手間加えてイラストの印象を華やかにする【前編】

カテゴリ

Ruby/RailsRailsの小技Rubyの小技Gemの紹介ActiveRecord初心者向けWeb開発Java/ScalaテクUnixのあれこれデータベーススマホ開発HTML/CSS/JavaScriptデザイン製作インフラクラウドセキュリティエディタバージョン管理その他pythonWebマーケティングアクセス解析GoogleアナリティクスGoogleデータスタジオWeb広告SEOUI/UXソーシャルメディアアピリッツEC開発Webシステム開発コンサルティングWebデザインブロックチェーンゲーム紹介アプリ紹介ASP風景ライフハックパソコンツールガジェット仕事術健康生活書評Excel(エクセル)PowerPoint(パワーポイント)ゲーム制作/開発ゲームプランニングSpriteStudioマスターデータ入力/作成Unityキャラクターデザインゲームシナリオレベルデザインゲーム分析3DCGイラスト制作CG/アニメーション

    人気の記事
    最近の記事
    • 3,501 views
    • 2020-04-02
    Kali Linux 2020.2 導入と日本語化
    • 802 views
    • 2020-03-06
    rack-lineprofを改造して管理画面からファイル指定&ログ追跡出来るように
    • 778 views
    • 2020-03-05
    FactoryBot と Gimei を使って架空のユーザを作る
    • 579 views
    • 2020-02-04
    ActionCable実装しようwith webpack
    • 510 views
    • 2020-01-27
    この頃のプルリクに対するレビュー
    Facebook

      サイト情報
      • DoRubyとは
      • 株式会社アピリッツ

      ソーシャルアカウント
      • Facebook
      • Twitter

      企業情報
      • 会社概要
      • 採用情報
      • お問い合わせ
      サービス製品
      • レコメンドASP
      • サイト内検索ASP「Advantage Search」
      • オープンソースECサイト構築パッケージ「エレコマ」
      • 受注・在庫・商品情報一元管理「モールコネクター」
      • セキュリティ診断サービス
      • Googleアナリティクスセミナー

      Copyright © Appirits All Rights Reserved.