現在、私は次のセットアップを持っていますが、これはうまく機能しています。
struct Vertex {
glm::vec3 position;
glm::vec3 normal;
glm::vec2 texCoord;
}
std::vector<Vertex> vertices;
頂点属性:
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::normal));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::texCoord));
ここで、頂点属性を float から short に変更して、パフォーマンスを向上させたいと考えています。頂点の位置から始めようとしました。
OpenGL の Vertex Specification Best Practicesは、次のことを教えてくれます。
位置[...] これを行うには、モデル空間データを再配置して、すべての位置が原点の周りの [-1, 1] ボックスにパックされるようにします。これを行うには、すべての位置の中で XYZ の最小値/最大値を見つけます。次に、最小/最大ボックスの中心点をすべての頂点位置から差し引きます。次に、最小/最大ボックスの幅/高さ/深さの半分ですべての位置をスケーリングします。中心点とスケーリング係数を維持する必要があります。モデルからビューへのマトリックス (またはモデルからその他のマトリックスへ) を作成するときは、中心点のオフセットとスケールを変換スタックの一番上に適用する必要があります (つまり、最後に、描画する直前に)。
私もこのスレッドを読みました。
そのため、すべての頂点を [-1,1] にマッピングするこの前処理ステップを追加しました。
for (auto& v : vertices) {
v.position = (v.position - center) * halfAxisLengths;
}
頂点シェーダーで再スケーリングします
vec4 rescaledPos = vec4(in_pos, 1.0) * vec4(halfAxisLengths, 1.0) + vec4(center, 0.0);
gl_Position = P * V * M * rescaledPos;
GL_SHORT
の代わりに頂点属性を使用しGL_FLOAT
、正規化を次のように設定しGL_TRUE
ます。
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_SHORT, GL_TRUE, sizeof(Vertex), (void*) offsetof(Vertex, Vertex::position));
その結果、三角形のカオスが得られますが、fps が増加したモデルは得られません。
これは頂点属性を短く設定する正しい方法ですか?
または、Vertex 構造全体を変更する必要がありますか? はいの場合、これを行うための最良の方法は何ですか (ショーツ付きの glm ベクトル?)。
実際の例は素晴らしいでしょうが、見つかりませんでした。