「シェーダー」の版間の差分

imported>Katariya
編集の要約なし
 
(5人の利用者による、間の13版が非表示)
1行目: 1行目:
'''シェーダー'''([[英語]]:shader)とは、画像を描画時に加工する機能である。
'''シェーダー'''([[英語]]:shader)とは、本来は3DCGにおいて「陰影処理を行うこと」をいう。現在では「[[GPU]]で行う様々な処理の総称」となっている。


==[[DXライブラリ]]のシェーダー==
==概要==
DXライブラリにおいては、シェーダーを[[C言語]]っぽい言語で書き、付属のツールで[[コンパイル]]することができる。
シェーダーは大きくわけて[[GPU]]が固定機能として持つ「[[固定シェーダー]]」と、[[プログラマー]]が独自の処理を記述できる「[[プログラマブルシェーダー]]」に分けられる。
 
現在ではプログラマブルシェーダーが主流であるため「シェーダー=プログラマブルシェーダー」となっていることが多い。2018年時点で固定シェーダーを採用している現役製品は[[ニンテンドー3DS]]くらいである。
 
また、ほとんどの[[ゲームフレームワーク]]や[[ゲームエンジン]]では無駄に[[プログラミング]]しなくても定番のレンダリング処理はあらかじめ[[固定シェーダー]]として用意されている。これらでは内部的にはプログラマブルシェーダーを叩いているがソフトウェア的に固定シェーダーに見せている。
 
最近は[[人工知能]]だ[[ブロックチェーン]]だと[[GPGPU]]の絡みで普通の計算もし易い仕様の[[プログラミング言語]]も増えている。
 
 
==DXライブラリのシェーダー==
[[DXライブラリ]]においては、シェーダーを[[C言語]]っぽい言語で書き、付属のツールで[[コンパイル]]することができる。


===頂点シェーダー===
===頂点シェーダー===
未稿
未稿
===ピクセルシェーダー===
===ピクセルシェーダー===
バイナリの主な[[拡張子]]は".pso"すなわち「[[ファンタジースターオンライン|ぷそ]]」である。
バイナリの主な[[拡張子]]は".pso"すなわち「[[ファンタジースターオンライン|ぷそ]]」である。


[[テクスチャ]]([[プログラム]]で指定した画像)上の位置(左上を(0.0,0.0)、右下を(1.0,1.0)とする)などのパラメータが渡され、
[[テクスチャ]]([[プログラム]]で指定した画像)上の位置(左上を(0.0,0.0)、右下を(1.0,1.0)とする)などのパラメータが渡され、
その位置に書き込みたい色のデータを返す。
その位置に書き込みたい色の[[データ]]を返す。色のデータは、[[RGBA]]の各要素をそれぞれ0.0~1.0の実数で表す形式で入出力する。
色のデータは、RGBAの各要素をそれぞれ0.0~1.0の実数で表す形式で入出力する。


例:[[グレースケール]]化
例:[[グレースケール]]化
46行目: 56行目:
一応[[行列]]の積などの計算もできそうだが、普通に計算したほうが速いし正確。
一応[[行列]]の積などの計算もできそうだが、普通に計算したほうが速いし正確。


==[[DirectX]]のシェーダー==
==DirectXのシェーダー==
DirectXでは上位シェーダーモデルとして'''HLSL(High-Level Shader Language:上位レベルシェーダ言語)'''が採用されている。
[[DirectX]]では「[[HLSL]]」を用いる。
HLSLはDirectX9から実装された高級シェーダー言語であり、C言語風な書き方ができるようになっている。


現在、シェーダーモデル1~5までが存在しており、それぞれでの使える機能・対応するDirectX自体のバージョンが違うため、注意が必要となる
==Unityのシェーダー==
Unityでは「[[CG言語]]」を用いる。


Direct3D 9の場合(シェーダーモデル1.x~3.0)は、頂点シェーダーとピクセルシェーダーの二つが提供されていた。
==OpenGLのシェーダー==
[[OpenGL]]および[[OpenGL ES]]は「[[GLSL]]」を用いる。


Direct3D 10.xの場合(シェーダーモデル4.x)は、そこにジオメトリシェーダーが追加。
==Metalのシェーダー==
Metalでは「[[Metal Shading Language]]」を用いる。


Direct3D 11.xの場合(シェーダーモデル5.0)では、ハルシェーダー、ドメインシェーダー、コンピュートシェーダー(計算シェーダー、演算シェーダー)が追加となった。
== Vulkanのシェーダー ==
 
[[Vulkan]]では「[[GLSL]]」および「[[HLSL]]」の2種類が利用可能となった。
ただし、コンピュートシェーダーに関してはグラフィックパイプラインの機能ではなく、物理衝突演算やアニメーション計算などの計算時にGPUを使用するための機能として提供されている。
 
なお、ファイルの[[拡張子]]は'''''.fx'''''となっている
 
----
 
例:HLSLによる単純な3Dポリゴンの描画(バージョンはvs2.0,ps2.0)
<pre>
 
//グローバル変数
float4x4 worldViewProjMat; //射影変換用行列
 
//テクスチャ
texture modelTexture; // テクスチャ情報の格納
 
// サンプラー(テクスチャの状態を規定する構造体)
sampler texSampler = sampler_state
{
  Texture =<modelTexture>;
  MinFilter =LINEAR;
  MagFilter =LINEAR;
  MipFilter =NONE;
 
  AddressU =Clamp;
  AddressV =Clamp;
};
 
//頂点シェーダからピクセルシェーダーに渡す構造体
struct VertexShaderResult
{
  float4 Position : POSITION;
  float2 TexCoord : TEXCOORD0;
};
 
//頂点シェーダ
VertexShaderResult VS( float4 _pos:POSITION, float2 _texCoord:TEXCOORD)
{
  VertexShaderResult Out = (VertexShaderResult )0;//出力データ
  Out.Position = mul(_pos, worldViewProjMat);//位置座標
  Out.TexCoord = _texCoord;//テクスチャ座標
  return Out;
}
 
//ピクセルシェーダ
float4 PS( VertexShaderResult _vertexResult ):COLOR
{
  // テクスチャの貼り付け
  return tex2D( texSampler , _vertexResult.TexCoord );
}
 
// テクニック
// DirectX側でこのテクニックを指定することで
// このテクニックで指定した頂点シェーダーとピクセルシェーダーで描画を行う
technique SampleShader
{
  pass P0
  {
  VertexShader = compile vs_2_0 VS(); // 頂点シェーダーを2.0のシェーダーモデルで描画
  PixelShader = compile ps_2_0 PS();  // ピクセルシェーダーを2.0のシェーダーモデルで描画
  }
}
 
</pre>
 
==[[Unity]]のシェーダー==
未稿
 
==[[OpenGL]]のシェーダー==
未稿


==関連項目==
==関連項目==
* [[画像処理]]
*[[画像処理]]
* [[シェーディング言語]]
*[[シェーディング言語]]
*[[MonoGameでシェーダーを使う]]


{{stub}}
[[category: コンピューター・グラフィックス]]
[[category: 3DCG]]
[[category: GPU]]