wgld.orgで解説されているWebGLのスフィア環境マッピング(Matcap Shader)を参考にシェーダーを作成してみたのですが、matcap.vertの部分でエラーになってしまいます。
実行環境はWeb版ではなく、Windows版のOpenGLのhgimg4.asです。
HSP3のバージョンは、HSP3.6bate4です。(bate5については今日知りましたので、これから研究します)
以下がその作成したファイルです。
・obj.materialは、モデルに対するマテリアルファイルだと思ってください。
・untitled.pngがMatcap用のテクスチャーです。
matcap.vert
attribute vec3 position; attribute vec3 normal; uniform mat4 u_mvpMatrix; uniform mat4 u_normalMatrix; varying vec3 vNormal; void main(void){ vNormal = normalize((u_normalMatrix * vec4(normal, 0.0)).xyz); gl_Position = u_mvpMatrix * vec4(position, 1.0); }
matcap.frag
precision mediump float; uniform sampler2D u_texture; varying vec3 vNormal; void main(void){ vec2 texCoord = (vNormal.xy + 1.0) / 2.0; vec4 smpColor = texture2D(u_texture, vec2(texCoord.s, 1.0 - texCoord.t)); gl_FragColor = smpColor; }
obj.material
material matcap { u_wvpMatrix = WORLD_VIEW_PROJECTION_MATRIX u_normalMatrix = INVERSE_TRANSPOSE_WORLD_VIEW_MATRIX sampler u_Texture { mipmap = true wrapS = REPEAT wrapT = REPEAT } renderState { cullFace = false depthTest = true } technique { pass { vertexShader = res/shaders/matcap.vert fragmentShader = res/shaders/matcap.frag } } } material mat1 : matcap { sampler u_Texture { path = res/untitled.png wrapS = REPEAT wrapT = REPEAT } }
恐らく、matcap.vertのpositionとnomalが原因なんじゃないかと思っています。
HGIMG4ではskinig.vertに記述してあるような、getPotiton()やgetNomal()も記述して、それを代入する必要があるのかもしれませんが、よく分かりませんでした。
Matcapシェーダーを実装できるなら、上記のスクリプトのやり方でなくとも構いません。
失敗の原因が分かる方、または別のスクリプトで実装できるよという方がいらっしゃいましたら、ぜひご教授お願い致します。