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

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

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

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

C++

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

Q&A

解決済

1回答

542閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿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}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問