シェーダー
シェーダー(英語:shader)とは、本来は3DCGにおいて「陰影処理を行うこと」をいう。現在では「GPUで行う様々な処理の総称」となっている。
概要[編集 | ソースを編集]
シェーダーは大きくわけてGPUが固定機能として持つ「固定シェーダー」と、プログラマーが独自の処理を記述できる「プログラマブルシェーダー」に分けられる。
現在ではプログラマブルシェーダーが主流であるため「シェーダー=プログラマブルシェーダー」となっていることが多い。2018年時点で固定シェーダーを採用している現役製品はニンテンドー3DSくらいである。
また、ほとんどのゲームフレームワークやゲームエンジンでは無駄にプログラミングしなくても定番のレンダリング処理はあらかじめ固定シェーダーとして用意されている。これらでは内部的にはプログラマブルシェーダーを叩いているがソフトウェア的に固定シェーダーに見せている。
最近は人工知能だブロックチェーンだとGPGPUの絡みで普通の計算もし易い仕様のプログラミング言語も増えている。
DXライブラリのシェーダー[編集 | ソースを編集]
DXライブラリにおいては、シェーダーをC言語っぽい言語で書き、付属のツールでコンパイルすることができる。
頂点シェーダー[編集 | ソースを編集]
未稿
ピクセルシェーダー[編集 | ソースを編集]
テクスチャ(プログラムで指定した画像)上の位置(左上を(0.0,0.0)、右下を(1.0,1.0)とする)などのパラメータが渡され、 その位置に書き込みたい色のデータを返す。色のデータは、RGBAの各要素をそれぞれ0.0~1.0の実数で表す形式で入出力する。
例:グレースケール化
//おまじない struct PS_INPUT { float4 DiffuseColor : COLOR0; float4 SpecularColor : COLOR1; float2 TextureCoord0 : TEXCOORD0; float2 TextureCoord1 : TEXCOORD1; }; struct PS_OUTPUT { float4 Output : COLOR0; }; sampler DiffuseMapTexture : register(s0); //メインのプログラムを書く PS_OUTPUT main(PS_INPUT PSInput) { PS_OUTPUT PSOutput; float4 nowColor; //指定された場所のテクスチャの色を取得するおまじない nowColor=tex2D(DiffuseMapTexture,PSInput.TextureCoord0); //グレースケールにする計算 PSOutput.Output.r=0.298912f*nowColor.r+0.586611f*nowColor.g+0.114478f*nowColor.b; PSOutput.Output.g=PSOutput.Output.r; PSOutput.Output.b=PSOutput.Output.r; PSOutput.Output.a=nowColor.a; //計算結果を返す return PSOutput; }
一応行列の積などの計算もできそうだが、普通に計算したほうが速いし正確。
DirectXのシェーダー[編集 | ソースを編集]
Unityのシェーダー[編集 | ソースを編集]
Unityでは「CG言語」を用いる。
OpenGLのシェーダー[編集 | ソースを編集]
OpenGLおよびOpenGL ESは「GLSL」を用いる。
Metalのシェーダー[編集 | ソースを編集]
Metalでは「Metal Shading Language」を用いる。
Vulkanのシェーダー[編集 | ソースを編集]
Vulkanでは「GLSL」および「HLSL」の2種類が利用可能となった。