質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

[opengl] 実行するたびに立方体の形が変わる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

294閲覧

投稿2022/10/30 11:38

提示コードですが以下の画像のよに実行するたびに立方体の形が変わってしまう原因が知りたいです。乱数による処理は用いていません。
ブレンダーで最初に作成したときのキューブをそのままエクスポートしています。出力設定は以下の画面の通りですスムージングですが面、辺といったものを試しました。頂点の読み込みはassimpで行っています。またコンソール画面による出力で頂点の位置やインデックスの位置が変わっていないか確認しました。原因がわかりません。

環境

windows 10
c++
opengl

blender

イメージ説明

コンソール

イメージ説明

実行画面

イメージ説明
イメージ説明

モデルロード

cpp

1 2/*############################################################################################ 3# モデル ロード 4############################################################################################*/ 5FrameWork::Model FrameWork::Resource::LoadModel(const std::string path) 6{ 7 Assimp::Importer importer; 8 9 const aiScene* scene = importer.ReadFile("asset/model/mesh.fbx", 10 aiProcess_CalcTangentSpace | 11 aiProcess_Triangulate | 12 aiProcess_JoinIdenticalVertices | 13 aiProcess_SortByPType); 14 15 ProcessNode(scene->mRootNode, scene); 16 17 18 19 20 21 FrameWork::Model model; 22 23 model.mesh = meshes; 24 25 26 27 28 meshes.clear(); 29 return model; 30} 31 32void FrameWork::Resource::ProcessNode(aiNode* node, const aiScene* scene) 33{ 34 for (unsigned int i = 0; i < node->mNumMeshes; i++) 35 { 36 aiMesh* mesh = scene->mMeshes[node->mMeshes[i]]; 37 meshes.push_back(ProcessMesh(mesh, scene)); 38 } 39 40 for (unsigned int i = 0; i < node->mNumChildren; i++) 41 { 42 ProcessNode(node->mChildren[i], scene); 43 } 44 45} 46 47FrameWork::Mesh FrameWork::Resource::ProcessMesh(aiMesh* mesh, const aiScene* scene) 48{ 49 std::vector<Vertex> vertices; 50 std::vector<unsigned int> indices; 51 52 for (unsigned int i = 0; i < mesh->mNumVertices; i++) 53 { 54 Vertex vertex; 55 // positions 56 vertex.x = mesh->mVertices[i].x; 57 vertex.y = mesh->mVertices[i].y; 58 vertex.z = mesh->mVertices[i].z; 59 60 std::cout << vertex.x << std::endl; 61 std::cout << vertex.y << std::endl; 62 std::cout << vertex.z << std::endl; 63 std::cout << std::endl; 64 65 66 67 vertices.push_back(vertex); 68 } 69 70 for (unsigned int i = 0; i < mesh->mNumFaces; i++) 71 { 72 aiFace face = mesh->mFaces[i]; 73 for (unsigned int j = 0; j < face.mNumIndices; j++) 74 { 75 indices.push_back(face.mIndices[j]); 76 } 77 } 78 79 Mesh data; 80 data.vertex = vertices; 81 data.index = indices; 82 83 84 return data; 85} 86 87
モデル描画

cpp

1#include "Model.hpp" 2#include <string> 3#include <vector> 4 5#include <iostream> 6 7#include <glm/glm.hpp> 8#include <assimp/Importer.hpp> 9#include <assimp/scene.h> 10#include <assimp/postprocess.h> 11 12 13FrameWork::Model::Model() 14{ 15 glGenVertexArrays(1, &vao); 16 glGenBuffers(1, &vbo); 17 glGenBuffers(1, &ebo); 18 19/* 20 glBindVertexArray(vao); 21 glBindBuffer(GL_ARRAY_BUFFER, vbo); 22 23 glBufferData(GL_ARRAY_BUFFER, vertex.size() * sizeof(VertexAttribute_Sprite), vertex.data(), GL_DYNAMIC_DRAW); 24 25 glBindVertexArray(0); 26 glBindBuffer(GL_ARRAY_BUFFER, 0); 27*/ 28} 29 30 31void FrameWork::Model::setVertexBuffer() 32{ 33 glBindVertexArray(vao); 34 glBindBuffer(GL_ARRAY_BUFFER, vbo); 35 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); 36 37 glBufferData(GL_ARRAY_BUFFER, mesh.at(0).vertex.size() * sizeof(VertexAttribute), mesh.at(0).vertex.data(), GL_DYNAMIC_DRAW); 38 39 40 for (int i = 0; i < mesh.at(0).index.size(); i++) 41 { 42 std::cout << "aaaaaaa " << mesh.at(0).index.at(i) << std::endl; 43 } 44 45 glBufferData(GL_ELEMENT_ARRAY_BUFFER, mesh.at(0).index.size() * sizeof(unsigned int), mesh.at(0).index.data(), GL_STATIC_DRAW); 46 47 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); 48 glBindVertexArray(0); 49 glBindBuffer(GL_ARRAY_BUFFER, 0); 50 51 52} 53 54 55 56void FrameWork::Model::Render() 57{ 58 //std::cout<<"あああ"<<std::endl; 59 60 glBindVertexArray(vao); 61 glBindBuffer(GL_ARRAY_BUFFER, vbo); 62 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); 63 64 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexAttribute) * mesh.at(0).vertex.size(), mesh.at(0).vertex.data()); 65 66 67 glDrawElements(GL_TRIANGLES,mesh.at(0).index.size(),GL_UNSIGNED_INT,(void*)0); 68 69 //glDrawArrays(GL_TRIANGLE_STRIP, 0, mesh.at(0).vertex.size()); //描画 70 71 glBindVertexArray(0); 72 glBindBuffer(GL_ARRAY_BUFFER, 0); 73 glBindTexture(GL_TEXTURE_2D, 0); 74 75} 76 77void FrameWork::Model::Update() 78{ 79 80}

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

0

ベストアンサー

原因

頂点バッファの指定が間違えていた。
頂点情報が以下ような形なのでバッファ指定も

cpp

1struct VertexAttribute 2 { 3 GLfloat position[3]; 4 //GLfloat uv[2]; 5 //GLfloat normal[3]; 6 //GLfloat color[4]; 7 8 };

以下のようにしないといけない。

cpp

1shader->setVertexAttribute(model.vao,model.vbo, "vertexPosition", 3, sizeof(FrameWork::VertexAttribute), sizeof(float) * 0);

cpp

1void FrameWork::Shader::setVertexAttribute(const GLuint vao,const GLuint vbo,const char *name,const int elementNum,const size_t size,const size_t startSize) 2{ 3 glBindVertexArray(vao); 4 glBindBuffer(GL_ARRAY_BUFFER, vbo); 5 6 GLuint attrib = getAttribLocation(name); 7 glEnableVertexAttribArray(attrib); 8 glVertexAttribPointer(attrib, elementNum, GL_FLOAT, GL_FALSE, size, (void*)(startSize)); 9 setBindAttribLocation(name); 10 11 glBindVertexArray(0); 12 glBindBuffer(GL_ARRAY_BUFFER, 0); 13} 14

投稿2022/10/30 11:49

退会済みユーザー

退会済みユーザー

総合スコア0

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

OpenGL

OpenGLは、プラットフォームから独立した、デスクトップやワークステーション、モバイルサービスで使用可能な映像処理用のAPIです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。