回答編集履歴
1
ビットとバイトの誤りを修正
answer
CHANGED
@@ -6,7 +6,7 @@
|
|
6
6
|
- バーテックスシェーダーに法線用のattribute変数を追加する
|
7
7
|
- シェーダーリンク時に`glBindAttribLocation`でシェーダー内の変数に一意な番号を付ける(または、シェーダーをリンクした後で、自動的に設定された番号を`glGetAttribLocation`で調べる)
|
8
8
|
- その番号を`glEnableVertexAttribArray`を使って使用可能にする(初期状態ではすべての番号は使用不能に設定されているので、明示的に使用可能にします)
|
9
|
-
- `glVertexAttribPointer`で、その番号と対応する属性の要素数(floatやintなら1、vec2やivec2なら2...ここでは法線なので、vec3が適当でしょう。その場合は3です)、要素の成分のデータ型(vec3は3つのfloatからなるのでGL_FLOAT)、整数で与えられたデータを正規化するか(もし法線でなく、例えば色の情報を追加するとして、しかも与える側のデータが0〜255の整数...などという状況の場合、これを設定するとシェーダー側では0.0〜1.0に変換された値として取り出されるので便利)、ストライド(ある頂点の頂点データの先頭から、次の頂点の頂点データの先頭まで何バイト読み進めればいいか...今まで位置しか属性を使用していなかった場合は0を設定していたかもしれませんが、0の場合は自動的に「1つの属性だけが密に詰まっている」と解釈してくれるため正しく指定されますが、今回のように複数の属性を交互に詰める場合、読み進める量を正しく渡してやる必要があります)、オフセット(この属性が頂点データの先頭から何バイト先にあるか...今回の場合、法線データの前には位置データが入っていますので、float3つ分で
|
9
|
+
- `glVertexAttribPointer`で、その番号と対応する属性の要素数(floatやintなら1、vec2やivec2なら2...ここでは法線なので、vec3が適当でしょう。その場合は3です)、要素の成分のデータ型(vec3は3つのfloatからなるのでGL_FLOAT)、整数で与えられたデータを正規化するか(もし法線でなく、例えば色の情報を追加するとして、しかも与える側のデータが0〜255の整数...などという状況の場合、これを設定するとシェーダー側では0.0〜1.0に変換された値として取り出されるので便利)、ストライド(ある頂点の頂点データの先頭から、次の頂点の頂点データの先頭まで何バイト読み進めればいいか...今まで位置しか属性を使用していなかった場合は0を設定していたかもしれませんが、0の場合は自動的に「1つの属性だけが密に詰まっている」と解釈してくれるため正しく指定されますが、今回のように複数の属性を交互に詰める場合、読み進める量を正しく渡してやる必要があります)、オフセット(この属性が頂点データの先頭から何バイト先にあるか...今回の場合、法線データの前には位置データが入っていますので、float3つ分で4*3=12バイトのずれがあります)を指定する
|
10
10
|
|
11
11
|
といった事項でしょうか。これでシェーダーに位置に加えて法線も渡せるようになるでしょう。
|
12
12
|
頂点法線の場合は特に問題ないでしょうが、面法線の場合は、書き出されたデータ形式によっては、頂点の数と法線の数が一対一対応していないかも知れません。OpenGLは頂点の各属性が頂点の数と一対一対応していることを期待しているので、その場合は詰めるデータを加工して一対一対応させた上でVBOに送らなければならないかもしれません。
|