1

現在、私は次のセットアップを持っていますが、これはうまく機能しています。

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 ベクトル?)。

実際の例は素晴らしいでしょうが、見つかりませんでした。

4

2 に答える 2

1

頂点バッファーのデータ構造を調整しました。

struct newVertex {
    GLshort position[4]; // for GL_SHORT
    GLint normal; // for GL_INT_2_10_10_10_REV
    GLshort texCoord[2]; // for GL_SHORT
};

その結果、パフォーマンスが最大 20% 向上します。

于 2016-04-22T09:21:01.037 に答える