法線mapとTangentを供給する
https://github.com/KhronosGroup/glTF-Sample-Models/tree/master/2.0/DamagedHelmet をサンプルモデルとした。
glActiveTexture
がうまくいかず難航する。
以下のようにして、無理やり解決。
すべての sampler2D が 0 にバインディングされる挙動だった。
#version 420
はうまくいかなかったので断念。
エラーは出ないが、何もレンダリングされなくなった。
Tangent が格納されていないので生成する
https://github.com/KhronosGroup/glTF/tree/master/specification/2.0 に以下のよう書いてある。
Implementation note: When tangents are not specified, client implementations should calculate tangents using default MikkTSpace algorithms. For best results, the mesh triangles should also be processed using default MikkTSpace algorithms.
MikkTSpace
さくっと dll を作成して、 luajit から呼びだしてみた。
indices
POSITION
NORMAL
TEXCOORD0
を入力して TANGENT
を出力する。
わりと適当で動く luajit ffi
恐るべし。
さすがに C の方に呼びだし回数を減らすラッパーを作ったほうが速そうだが、動かすだけなら問題なし。
memo
Shader
OpenGL 4.0 Shading Language Cookbook
の phong shading を省略して法線だけ確認。
2倍して1引く
を補った。
glTF の シェーダー では、 mat3
を fragment shader に送りこんでいた。
tangent space でライティングするという概念は同じらしい。