この方法でデータを保存する obj ファイルがあります。
v value1 value2 value3
f value1 value2 value3
最初に面の法線を計算し、次にその面の各頂点に割り当てます。
for(int i = 0; i < verticesInd.size(); i+=3)
{
glm::vec3 normal = glm::normalize(glm::cross(glm::vec3(vertices[verticesInd[i + 1]]) - glm::vec3(vertices[verticesInd[i]]), glm::vec3(vertices[verticesInd[i + 2]]) - glm::vec3(vertices[verticesInd[i]])));
out_Normals[i] = normal;
out_Normals[i + 1] = normal;
out_Normals[i + 2] = normal;
}
フラット シェーディングを実現するために、頂点を複製できます。
for(int i = 0; i < verticesInd.size(); i++)
{
out_Vertices.push_back(vertices[verticesInd[i]]);
}
次に、glDrawArrays を使用してオブジェクトを描画します。
glDrawArrays(GL_TRIANGLES, 0, out_Vertices.size());
滑らかなシェーディングを実現するには、各頂点の法線を平均化する必要がありますが、隣接する面を見つける方法がわかりません。
Edit1: f: の前に単一の s パラメータに気づきませんでした:
v value1 value2 value3
s 1
f value1 value2 value3
Edit2:法線の平均化
glm::vec3 tNormal;
for(int i = 0; i < vertices.size(); i++)
{
for(int j = 0; j < verticesInd.size(); j++)
{
if(verticesInd[j] == i)
{
tNormal += faceNormals[j / 3];
}
}
aNormals.push_back(glm::normalize(tNormal));
tNormal = glm::vec3(0,0,0);
}
3 つの面の法線を編集します。
for(int i = 0; i < verticesInd.size(); i+=3)
{
glm::vec3 normal = glm::normalize(glm::cross(glm::vec3(vertices[verticesInd[i + 1]]) - glm::vec3(vertices[verticesInd[i]]), glm::vec3(vertices[verticesInd[i + 2]]) - glm::vec3(vertices[verticesInd[i]])));
faceNormals.push_back(normal);
}