カスタムシェーダー
このチュートリアルでは、GLSLを使用してマテリアル上にカスタムシェーダーを作成してディゾルブエフェクトを作ります。
3DモデルをPlayCanvasにインポートすると、デフォルトで [物理マテリアル] 3が使用されます。これは、多くのレンダリングニーズをカバーできる汎用的なマテリアルです。
しかし、マテリアルの特別な効果や特殊ケースを実行する必要がある場合があります。その場合は、カスタムシェーダーを記述する必要があります。
シェーダーとシェーダー定義
WebGLでは、すべてのブラウザで実行できる シェーダーを作成するためにGLSL言語を使用します。 PlayCanvasでは、Shaderアセットでこのコードを作成し、その後、[Shader Definition] 1にコードを割り当てて、この定義を使用して新しい pc.Shader
を作成します。
バーテックスシェーダー
attribute vec3 aPosition;
attribute vec2 aUv0;
uniform mat4 matrix_model;
uniform mat4 matrix_viewProjection;
varying vec2 vUv0;
void main(void)
{
vUv0 = aUv0;
gl_Position = matrix_viewProjection * matrix_model * vec4(aPosition, 1.0);
}
フラグメントシェーダー
varying vec2 vUv0;
uniform sampler2D uDiffuseMap;
uniform sampler2D uHeightMap;
uniform float uTime;
void main(void)
{
float height = texture2D(uHeightMap, vUv0).r;
vec4 color = texture2D(uDiffuseMap, vUv0);
if (height < uTime) {
discard;
}
if (height < (uTime+0.04)) {
color = vec4(0, 0.2, 1, 1.0);
}
gl_FragColor = color;
}
上記の2つのシェーダーは、新しいマテリアルの機能を定義しています。バーテックスシェーダーでは、メッシュの頂点位置をスクリーンスペースに変換しています。フラグメントシェーダーでは、ピクセルの色を設定しています。このピクセルの色は、このアセットに提供される2つのテクスチャに基づいて選択されます。値uTimeがハイトマップ中の色よりも小さい場合は、任意のピクセルをレンダリングしません(モデルが不可視になります)。uTimeの値がハイトマップの値よりも大きい場合は、提供する拡散マップテクスチャからカラーを取得します。
シェーダー定義
var vertexShader = this.vs.resource;
// dynamically set the precision depending on device.
var fragmentShader = "precision " + gd.precision + " float;\n";
fragmentShader = fragmentShader + this.fs.resource;
// A shader definition used to create a new shader.
var shaderDefinition = {
attributes: {
aPosition: pc.SEMANTIC_POSITION,
aUv0: pc.SEMANTIC_TEXCOORD0
},
vshader: vertexShader,
fshader: fragmentShader
};
シェーダー定義には3つのセクションがあります。 attributes
では、あなたの頂点シェーダーが実行される各頂点の属性の変数名と値を指定する必要があります。これらの値は後であなたの頂点シェーダーで attribute
として宣言されます。
バーテックスシェーダーコードは、 vshader
プロパティで文字列として提供され、フラグメントシェーダーは 'fshader'プロパティで文字列として提供されます。
上記はディゾルブエフェクトを作成するために使用されるシェーダー定義です。注意点として、2つのアセットからシェーダーコードを取得していることに注目してください。これらのアセットはスクリプト属性を使用して提供され、スクリプトからアセットに簡単にアクセスできます。
属性以外に、GLSLシェーダーには2つの特別なタイプの変数 varying
と uniform
があります。
GLSL varying
変数
varying で宣言された変数は、頂点シェーダーで設定され、フラグメントシェーダーで使用されます。これは、最初のプログラムから2番目にデータを渡す方法です。