Tag Archives: 固定機能パイプライン

プログラマブルシェーダ(3DCG全般の基礎知識めも)

前回はDirect3D 9をベースにレンダリングする時のパイプラインと、関連用語についてお勉強しました。(前回はコチラから。別窓でジャンプします。)

前回に続き今回はシェーダという処理について、OpenGL というDirect3Dと同様に非常に有名なグラフィックAPIも含めて簡単に確認しておこうと思います。相変わらずあちらこちらをを読みながらお勉強した内容をまとめたものですので、間違っている知識があればご指摘大歓迎です。

■Direct3D9のシェーダでプログラマブルな箇所

 

Direct3D9で頂点処理とピクセル処理がプログラマブルシェーダ部分

Direct3D9のパイプラインとプログラマブルシェーダー

どちらも固定機能パイプライン機能(GPU機能によるプリミティブ3Dデータ、頂点データを描画する対象の3D座標系に変換する機能)か、プログラマが独自に頂点情報を変換するプログラムを記載して頂点座標を変換するプログラマブルシェーダという機能を持っています。

上の図にプログラマブルシェーダで記載可能な部分を吹き出しで書いてみました。頂点シェーダとピクセルシェーダの2箇所のようです。プログラマブルシェーダを、Direct3D9では「HLSL言語(High Language Shader Language)」で記載可能なようです。

■OpenGLとシェーダ

Unity5 では Direct3D 9 がデフォルトで利用される2D/3D CG用APIとなっています。Direct3D 9 が利用できなければOpenGL 2.1 を利用するようですが、基本的な流れはDirect3D 9 と似ているようです。

OpenGL2.0 以降でも同様にシェーダとして頂点シェーダフラグメントシェーダ(Direct3D9でいうピクセルシェーダのような箇所)の部分がプログラマブルとなっています。OpenGL2.X では「GLSL言語(The OpenGL Shading Language)」としてシェーダを記載可能とのこと。

■Unity5でシェーダを記載するとき

Unityでシェーダを記載するときは、Cg言語(C for Graphics)、もしくはHLSL言語で記載でき、OpenGL専用言語(GLSL言語)上にも互換性をもった変換できるようです。(ただし、プログラマブルシェーダを利用できない古いハードウェアへの互換を意識するときは代替処理としてShaderLabという言語で固定機能パイプライン向きの固定関数シェーダを記載するようです。)

Unityには3種類のシェーダがあるようです。(公式Manualより)

Unity5の3種のシェーダ

  1. サーフェイスシェーダ(Surface Shader) ・・・特別な照明や影の処理を記載
  2. 頂点シェーダ(Vertex Shader) ・・・ 特別な頂点処理を記載
  3. フラグメントシェーダ(Fragment Shader) ・・・ 特別なピクセル処理を記載

 

とりあえず今後Unity5でのシェーダ記載が必要になったらCg言語のお作法を覚えていこうと思います。

 

非常に参考となりましたサイト様:

床井研究室 – 2009年08月27日 第3回 シェーダプログラム

MSDN – GLSL と HLSL の対応を示すリファレンス

beer.blendernpr.org – The basic of GLSL

Unity公式マニュアル – Materials And Shaders