LoginSignup
7
3

More than 5 years have passed since last update.

THREE.MeshPhongMaterialを改造する

Last updated at Posted at 2017-09-13

自作でphongを使いたい時用。

PhongをShaderMaterialで書くとこんな感じ。

var phongShader = THREE.ShaderLib.phong;
var uniforms = THREE.UniformsUtils.clone(phongShader.uniforms);

material = new THREE.ShaderMaterial({
  uniforms: uniforms,
  vertexShader: phongShader.vertexShader,
  fragmentShader: phongShader.fragmentShader,
  lights:true//ライトの影響を受けられるように
});

phongShader.vertexShader,
phongShader.fragmentShaderを改造すればよい。

phongのvert / frag のソースはこれ

中身をみると#includeが並んでいるが、これはthreejsが自前でincludeする実装している。includeの行をコメントアウトし(削除しないとエラーになるかも)、代わりに自分のコードを描けばよい
https://github.com/mrdoob/three.js/blob/master/src/renderers/shaders/ShaderLib/meshphong_vert.glsl
https://github.com/mrdoob/three.js/blob/master/src/renderers/shaders/ShaderLib/meshphong_frag.glsl

はまりポイント

  • lights:trueというのを渡すとライトが有効になります。(fog: true というのもあります。)
  • map:trueというのは無くて、#define USE_MAPってシェーダーの一番上に書くとmapが使えます。
  • そのほかUSE_なんとか、がいっぱいありますので、適当に有効にします。

※要はmaterial共通のものか/固有のものか、で上記のような違いがあるようです。lights:trueになってると、どっかでまとめてlightの情報をuniformに渡しているようです。

USE_なんとか 一覧(未完)

r87で確認中(phongで使われないものも含む
https://github.com/mrdoob/three.js/tree/master/src/renderers/shaders/ShaderChunk

名称 該当する主なvert/frag 備考
USE_ALPHAMAP alphamap_fragment.glsl
ALPHATEST alphatest_fragment.glsl
USE_AOMAP aomap_fragment.glsl
USE_BUMPMAP bumpmap_pars_fragment.glsl
USE_COLOR color_fragment.glsl 頂点カラー
ENVMAP_TYPE_CUBE_UV cube_uv_reflection_fragment.glsl
USE_DISPLACEMENTMAP displacementmap_vertex.glsl 頂点を変形するマップ
USE_EMISSIVEMAP emissivemap_fragment.glsl
USE_ENVMAP envmap_fragment.glsl
USE_FOG fog_fragment.glsl
USE_LIGHTMAP lightmap_fragment.glsl
TOON gradientmap_pars_fragment.glsl
---
---
---
---

そのほかシェーダーのソース群

https://github.com/mrdoob/three.js/tree/master/src/renderers/shaders
* THREE.ShaderChunk = 共通で使われるGLSLのコード片
* THREE.UniformsUtils = uniformsの定義を操作するユーティリティ関数群
* THREE.UniformsLib = 共通で使われるuniforms定義
* THREE.ShaderLib = 各マテリアルで使用するシェーダー定義

7
3
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
7
3