Unity_Shaderことはじめ(#00_基礎知識編)

  • 19
    いいね
  • 0
    コメント

Shaderことはじめ(Unity編)

はじめに

Shaderの学習初めの記事を書きます。

Shaderとは

「GPU を利用し高速にgraphicsを描画するための技術や概念の総称」

Shaderの特徴

  • 多くの場合において,高い演算能力を誇る GPU を駆使し高速に計算を行う
  • graphics 生成のあらゆる行程で活躍する
  • 役割に応じて xx shader, というふうに名前が付けられている場合が多い

3D API と shader の関係

3DCG を描くためには, 多くの計算や行程が必要で GPU と呼ばれる高速な演算装置を用いる(大抵のPCには詰まれています)

GPUがつまれているPCって?

大抵のPCにつまれています.

  • CPU とメモリを共有しているタイプの安価なもの(大抵のPCはこっち!)
  • GPU としての性能に特化したグラフィックボードと呼ばれる専用パーツ(主にゲーミングPC)

と様々な種類です.

GPU を利用するためのインターフェース(API)

GPU を利用するためのインターフェース(API)には, OSの種類や, その用途に合わせていくつかの種類がある.

  • WindowsのGPU API → DirectX
  • OSSの著名な API → OpenGL

GPUのAPIの働き

APIは非常に低レベルで, ハードウェア(GPU)に近い部分でアプリケーションとハードウェアとのめんどくさい処理を取り持ってくれます.

ちなみに、話題のちなみに話題 VulkanMetal メタルは, これより低layer

OpenGLとは

クロノス・グループ (英: Khronos Group) が策定している、グラフィックスハードウェア向けの2次元/3次元コンピュータグラフィックスAPI

モバイル向けAPIに OpenGL ES がある.

OpenGLのAPIの種類

用語 概要
OpenGL GPU を利用するための 3D API
OpenGL ES OpenGL のファミリーの中で, mobel端末向けに軽量化されたもの
WebGL OpenGL ES を Browser から制御できるようにしたもの

GLSLとは

OpenGL Shading Languageの略 C言語をベースとした高レベルシェーディング言語

アセンブリ言語やハードウェアに依存した言語を使わないで, 開発者がグラフィックスパイプラインを直接制御できるようにOpenGL ARB (Architecture Review Board) で策定

Cg/HLSLとは

Cgとは

CgはNVIDIAが開発していた, リアルタイム3次元コンピュータグラフィックスにおけるプログラマブルシェーダーのためのシェーディング言語

C for Graphics の略

HLSLとは

High Level Shading Languageの略

マイクロソフトによって開発された, Direct3D (DirectX) で使われるプログラマブルシェーダーのためのプロプライエタリなシェーディング言語である

NVIDIAと協力して開発されたことから、言語文法が Cg(C for Graphics) 言語に非常によく似ている

Unityでのシェーダーの種類

3種類

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

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

言語:Cg/HLSL

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

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

言語:Cg/HLSL

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

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

言語:ShaderLab

シェーダをサポートしていない端末の場合に利用されるもの

Vertex / Fragment Shaderの概要

Vertex Shader

3DCG に欠かすことのできない, vertex の座標変換を主な役割とする shader.

vertexがひとつで点を, vertexがふたつで線を, それ以上の個数の vertex を使うことで三角形や四角形を表現するのが, 3DCG の一般的な概念です.

VertexShader は, この vertex ひとつひとつを制御するためのものです.

vertex の個数=vertex_shader が実行される回数

描画する vertex が少なければ VertexShader の負荷も少なくなる.

Fragment Shader

API の種類によっては, PexelShader などと呼ばれることもある.

Fragment Shader は vertex_shader とは役割が異なり, 最終的に Screen に描かれる Pexel ひとつひとつ を対象とした処理を行います.

画面の解像度が大きいと, fragment_shader による負荷は大きい.

vertex_shader は vertex の個数に比例して負荷が増えますが, fragment_shader は実行される pexel 数が増加するにしたがって performance が落ちていきます.

両者の違いについてはしっかり理解しておきましょう.

  • VertexShader - 頂点の個数分だけ頂点ごとに実行される
  • FramgentShader- 描画するpexel単位で実行される

参考