以下のようなシェーダーを作成しましたが、実際に動作させてみると
表面が真っ黒に表示されるだけでした。
シェーダーは wgld.org のキューブ環境マッピングを参考にしています。
・obj.material は、objというGPBモデルに対する.materialだと思って下さい。
・cubemap.png は、sampleのpronama3dフォルダの cubemap.png です。
cubemap.vert
attribute vec3 a_position; attribute vec3 a_normal; uniform mat4 u_worldMatrix; uniform mat4 u_worldViewProjectionMatrix; varying vec3 v_Position; varying vec3 v_Normal; void main(){ v_Position = (u_worldMatrix * vec4(a_position, 1.0)).xyz; v_Normal = (u_worldMatrix * vec4(a_normal, 0.0)).xyz; gl_Position = u_worldViewProjectionMatrix * vec4(a_position, 1.0); }
cubemap.frag
#ifdef OPENGL_ES #extension GL_OES_standard_derivatives : enable #ifdef GL_FRAGMENT_PRECISION_HIGH precision highp float; #else precision mediump float; #endif #else precision mediump float; #endif uniform vec3 u_cameraPosition; uniform samplerCube u_cubemapTexture; varying vec3 v_Position; varying vec3 v_Normal; void main(){ vec3 ref = reflect(v_Position - u_cameraPosition, v_Normal); gl_FragColor = textureCube(u_cubemapTexture, ref); }
obj.material
material cubemap { u_worldMatrix = WORLD_MATRIX u_worldViewProjectionMatrix = WORLD_VIEW_PROJECTION_MATRIX u_cameraPosition = CAMERA_WORLD_POSITION sampler u_cubemapTexture { mipmap = true wrapS = CLAMP wrapT = CLAMP minFilter = LINEAR_MIPMAP_LINEAR magFilter = LINEAR } renderState { cullFace = true depthTest = true } technique { pass { vertexShader = res/shaders/cubemap.vert fragmentShader = res/shaders/cubemap.frag } } } material mat1 : cubemap { sampler u_cubemapTexture { path = res/cubemap.png } }
textureCubeがHGIMG4でサポートされていないのかなと思って調べたのですが、
HGIMG4のskyboxシェーダーの skybox.frag に
uniform samplerCube u_diffuseTexture;
がありました。
また.hsのgpmatprmtにも
optパラメーターに、GPOBJ_MATOPT_CUBEMAPを指定した場合は、テクスチャをキューブマップとして扱います。 キューブマップは、6面方向の画像をまとめた特殊な形式で環境マップやスカイボックスなどに利用することができます。 (キューブマップ画像は、+X,-X,+Y,-Y,+Z,-Z放送の6画像を縦に連結した1枚の.PNG形式を使用してください。)
という記述がありました。
つまり、HGIMG4ではキューブ環境マップの機能がすでに備わっていて、
samplerCubeは使えるのではないかと思いました。
ちなみに、この cubemap.vert と cubemap.frag シェーダーを動作させた際に、
エラーログは出ませんでした。
.material のsamplerの項目名を破れかぶれにsamplerCubeに変更してみても結果は同じでした。
なんとなく、.materialのどこかにGPOBJ_MATOPT_CUBEMAPに該当するような
コマンドを指定しないといけないのかなぁと思うのですが、
どこに何を指定すればいいか分かりませんでした。
もしくは、それとは全く関係ないことなのかもしれません。
どう改善すればよいかご存じの方がいらっしゃいましたら、ぜひご指南お願い致します。