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

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

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

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

Q&A

解決済

1回答

2423閲覧

[opengl初心者] 複数のVAO、VBOを使って描画させると座標がおかしくなる原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

C++

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

GLSL

GLSL (OpenGL Shading Language) はC言語をベースとしたシェーディング言語です。

1グッド

0クリップ

投稿2021/04/27 12:26

編集2021/04/28 05:42

提示コードのmain関数部ですが////コメント部の表示オブジェクト部の二つのスマートポインタでオブジェクトを二つ作るとおかしな画像提示画像部のような座標がおかしくなってしまいます。これはなぜでしょか?それぞれをコメントアウトして試しましたがどちらか一つだと正常に描画されます。これは何が原因なのでしょうか? 

試したこと

VAO、VBOが怪しいと思うのですがどうすればいいかわかりません。
色々な場所にglBindVertexArray(0); を記述しましたが描画されなくなりました。
シェーダーは毎フレーム適用と解除をつり返しているのですが原因がさっぱりわかりません。

おかしい画像↓
イメージ説明
3D描画↓
イメージ説明
2D描画↓
イメージ説明

cpp

1#include <iostream> 2#include <fstream> 3#include <cstdlib> 4#include <vector> 5#include <glew/include/GL/glew.h> 6#include <glfw/include/GLFW/glfw3.h> 7 8#include "Window.hpp" 9#include "Shader.hpp" 10#include "DrawTest_3D.hpp" 11#include "DrawTest_2D.hpp" 12 13 14int main() 15{ 16 if (glfwInit() == GL_FALSE) 17 { 18 std::cerr << "glfw初期化失敗。" << std::endl; 19 return -1; 20 } 21 22 atexit(glfwTerminate); //プログラム終了時の処理を登録 23 std::shared_ptr<Window> window = std::make_shared<Window>(); //コンテキストを作成 24 25 //OpenGL Verison 3.2 Core Profile を選択する 26 glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); 27 glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,5); 28 glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE); 29 glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE); 30 31 glClearColor(1.0, 0.0, 0.0, 1.0); //背景色 32// ############################################################################# 33 34/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 35 //表示オブジェクト 36 std::shared_ptr< DrawTest_3D> DrawTest3D = std::make_shared<DrawTest_3D>(); //3D 37 std::shared_ptr<DrawTest_2D> DrawTest2D = std::make_shared<DrawTest_2D>(); //2D 38 39/////////////////////////////////////////////////////////////////////////////////////////////////////////////// 40 41 42 43 44 45 while (*window) 46 { 47 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //カラーバッファをクリア 48 49 50 DrawTest2D->Update(); 51 DrawTest2D->Draw(); 52 53 DrawTest3D->Update(); 54 DrawTest3D->Draw(); 55 56 57 58 59 60 window->SwapBuffers(); //ダブルバッファリング 61 } 62 63}

cpp

1#include "DrawTest_3D.hpp" 2 3#include <iostream> 4#include "Shader.hpp" 5 6#include <glm/glm.hpp> 7#include <glm/gtx/transform.hpp> 8#include <glm/gtc/matrix_transform.hpp> 9 10//コンストラクタ 11DrawTest_3D::DrawTest_3D() 12{ 13 shader = std::make_shared<Shader>("BasicMono_3D.vert", "BasicMono_3D.frag"); //シェーダー 14 15 //頂点配列 16 struct Vertex 17 { 18 GLfloat position[2]; 19 }; 20 21 //頂点情報 22 Vertex rectangleVertex[6] = 23 { 24 //頂点 25 {-0.5f,0.5f}, 26 {-0.5f,-0.5f}, 27 {0.5f,0.5f}, 28 29 {0.5f,0.5f}, 30 {-0.5f,-0.5f}, 31 {0.5f,-0.5f}, 32 33 34 }; 35/////////////////////////////////////////////////////////////////////////////////////////////////////////// 36 //vao 37 glGenVertexArrays(1, &vao); 38 glBindVertexArray(vao); 39 40 //vbo 41 glGenBuffers(1, &vbo); 42 glBindBuffer(GL_ARRAY_BUFFER, vbo); 43 44 //頂点 45 GLint attrib = shader->getAttribLocation("vertexPosition"); 46 glEnableVertexAttribArray(attrib); 47 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 48 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); 49////////////////////////////////////////////////////////////////////////////////////////////////////////// 50 //モデル行列のパラメータを初期化 51 vecScale = glm::vec3(1.0f, 1.0f, 1.0f); //拡大縮小 52 vecRotate = glm::vec3(1.0f, 1.0f, 1.0f); //回転 53 angle = 0.0f; //回転量 54 vecTranslate = glm::vec3(0.0f, 0.0f, 0.0f); //平行移動 55 56 //モデル行列 57 translate = glm::translate(glm::mat4(1), vecTranslate); //平行移動 58 rotate = glm::rotate(angle, vecRotate); //回転 59 scale = glm::scale(glm::mat4(1), vecScale); //拡大縮小 60 61 //ビュー 62 glm::vec3 pos = glm::vec3(0, 0, 1); //座標 63 glm::vec3 center = glm::vec3(0, 0, -1); //向き 64 glm::vec3 up = glm::vec3(0, 1, 0); //上方向 65 view = glm::lookAt(pos, center, up); 66 67 68 projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形 69 70} 71 72//更新 73void DrawTest_3D::Update() 74{ 75 76} 77 78//描画 79void DrawTest_3D::Draw() 80{ 81 shader->setEnable(); 82 83 shader->setBindAttribVertex("vertexPosition"); 84 85 /*########## Unifrom ##########*/ 86 shader->setUniform4f("uFragment", glm::vec4(0.0, 0.0, 1.0, 1.0)); 87 shader->setUniformMatrix4fv("uTranslate", translate); 88 shader->setUniformMatrix4fv("uRotate", rotate); 89 shader->setUniformMatrix4fv("uScale", scale); 90 shader->setUniformMatrix4fv("uProjection", projection); 91 shader->setUniformMatrix4fv("uView", view); 92 93 94 95 96 97 98 glDrawArrays(GL_TRIANGLES, 0, 6); 99 100 101 102 103 shader->setDisable(); 104} 105 106//デストラクタ 107DrawTest_3D::~DrawTest_3D() 108{ 109 glDeleteVertexArrays(1, &vao); 110 glDeleteBuffers(1, &vbo); 111} 112 113

cpp

1#include "DrawTest_2D.hpp" 2 3#include <iostream> 4#include "Shader.hpp" 5 6#include <glm/glm.hpp> 7#include <glm/gtx/transform.hpp> 8#include <glm/gtc/matrix_transform.hpp> 9 10//コンストラクタ 11DrawTest_2D::DrawTest_2D() 12{ 13 shader = std::make_shared<Shader>("BasicMono_2D.vert", "BasicMono_2D.frag"); //シェーダー 14 15 16 17 18 19 //頂点情報 20 Vertex rectangleVertex[6] = 21 { 22 //頂点 23 {0.0f, 1.0f}, 24 {1.0f, 0.0f}, 25 {0.0f, 0.0f}, 26 27 {0.0f, 1.0f}, 28 {1.0f, 1.0f}, 29 {1.0f, 0.0f}, 30 31 }; 32/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 33 //vao 34 glGenVertexArrays(1, &vao); 35 glBindVertexArray(vao); 36 37 //vbo 38 glGenBuffers(1, &vbo); 39 glBindBuffer(GL_ARRAY_BUFFER, vbo); 40 41 //頂点 42 GLint attrib = shader->getAttribLocation("vertexPosition"); 43 glEnableVertexAttribArray(attrib); 44 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 45 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(GLfloat), (GLvoid*)0); 46/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// 47 48 //モデル行列のパラメータを初期化 49 size = glm::vec2(100.0f,100.0f); 50 vecScale = glm::vec3(size.x, size.y, 1.0f); //拡大縮小 51 vecRotate = glm::vec3(0.0f, 0.0f, -1.0f); //回転 52 angle = 0.0f; //回転量 53 vecTranslate = glm::vec3(0.0f, 0.0f, 0.0f); //平行移動 54 55 //モデル行列 56 translate = glm::translate(glm::mat4(1), vecTranslate); //平行移動 57 58 //回転 59 glm::mat4 m = glm::translate(translate, glm::vec3(size.x * 0.5f, size.y * 0.5f,0)); 60 rotate = glm::rotate(m,angle, vecRotate); 61 translate = glm::translate(translate, glm::vec3(-size.x * 0.5f, -size.y * 0.5f, 0)); 62 63 scale = glm::scale(glm::mat4(1), vecScale); //拡大縮小 64 65 //ビュー 66 /* 67 glm::vec3 pos = glm::vec3(0, 0, 1); //座標 68 glm::vec3 center = glm::vec3(0, 0, -1); //向き 69 glm::vec3 up = glm::vec3(0, 1, 0); //上方向 70 view = glm::lookAt(pos, center, up); 71 */ 72 73 74 //projection = glm::perspective(glm::radians(90.0f), 4.0f / 3.0f, 0.1f, 100.0f); //透視射形 75 projection = glm::ortho(0.0f, 640.0f, 480.0f, 0.0f, -1.0f, 1.0f); //透視射形 76 77} 78 79//更新 80void DrawTest_2D::Update() 81{ 82 83} 84 85//描画 86void DrawTest_2D::Draw() 87{ 88 shader->setEnable(); 89 shader->setBindAttribVertex("vertexPosition"); 90 91 /*########## Unifrom ##########*/ 92 shader->setUniform4f("uFragment", glm::vec4(0.0, 0.0, 1.0, 1.0)); 93 shader->setUniformMatrix4fv("uTranslate", translate); 94 shader->setUniformMatrix4fv("uRotate", rotate); 95 shader->setUniformMatrix4fv("uScale", scale); 96 shader->setUniformMatrix4fv("uProjection", projection); 97 //shader->setUniformMatrix4fv("uView", view); 98 99 100 101 102 103 104 glDrawArrays(GL_TRIANGLES, 0, 6); 105 106 107 108 109 110 111 shader->setDisable(); 112} 113 114//デストラクタ 115DrawTest_2D::~DrawTest_2D() 116{ 117 glDeleteVertexArrays(1, &vao); 118 glDeleteBuffers(1, &vbo); 119} 120 121
退会済みユーザー👍を押しています

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

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

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

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

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

hoshi-takanori

2021/04/27 16:14

描画の際にも glBindVertexArray が必要では?
退会済みユーザー

退会済みユーザー

2021/04/28 00:02

試しまたがダメでした。
fana

2021/04/28 07:00

(絵的に現象が分かりにくいので,双方で描画する物の色なり形なりを異なるものにした方が良いかと.)
guest

回答1

0

ベストアンサー

glBindVertexArray();は毎フレーム適用と解除を繰り返す必要がありました。

cpp

1 2 3 glBindVertexArray(vao); 4 5 6 glDrawArrays(GL_TRIANGLES, 0, 6); 7 8 9 glBindVertexArray(0);

投稿2021/04/28 07:52

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問