LoginSignup
22
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-01-21

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単位で実行される

参考

22
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17