1

Blender でモデル (Suzie) を生成し、法線を含む .obj ファイルにエクスポートしました。アプリへの読み込みモード中に、頂点と法線の数が異なることに気付きました (2012 年と 1967 年)。

モデルの詳細

シンプルなセルシェーディングを実装しようとしています。問題は、法線をシェーダーに渡すことです。頂点データを格納するには、glm のベクトルを使用します。

std::vector<unsigned int> face_indices;
std::vector<unsigned int> normal_indices;
std::vector<glm::vec3> geometry;
std::vector<glm::vec3> normals;

私がこれまでに得た結果

間違った法線

バッファのレイアウト

    glBindVertexArray(VAO);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);
    glBufferData(GL_ARRAY_BUFFER, geometry.size() * sizeof(glm::vec3), &geometry[0], GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glEnableVertexAttribArray(1);
    glBindBuffer(GL_ARRAY_BUFFER, NormalVBOID);
    glBufferData(GL_ARRAY_BUFFER, normals.size() * sizeof(glm::vec3), &normals[0], GL_DYNAMIC_DRAW);
    glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, VIndexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, face_indices.size() * sizeof(unsigned int), &face_indices[0], GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

レンダリング フラグメント

    glBindVertexArray(VAO);

    glPolygonMode(GL_FRONT_AND_BACK, GL_QUADS);
    glDrawElements(GL_QUADS, face_indices.size(), GL_UNSIGNED_INT, (void*)0);

    glBindVertexArray(0);
4

2 に答える 2

1

また、エクスポート前に Blender で Smooth モディファイヤを使用すると、場合によっては頂点ごとに 1 つの法線を確保するのに役立つことにも注意してください (面法線ビューの代わりに頂点ごとの法線ビューを設定する必要がある場合とない場合があります)。 .. rem できないので、テストする必要があります)。これは、デフォルトでブレンダーが面ごとの法線を使用するためです。Smooth モディファイヤ ("w" ホットキー メニュー) は、頂点ごとのノルムに切り替えます。次に、エクスポートするときに通常どおり頂点とノルムをエクスポートすると、数が一致するはずです。いつもではありませんが、これは過去に私にとってはうまくいきました。これは、インポート中のデータの不必要なジャグリングが少なくなることを意味する可能性があります。

于 2014-02-25T01:27:29.047 に答える