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

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

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

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

デバッグ

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

C++

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

Q&A

0回答

1524閲覧

[デバッグ] opengl テクスチャが正しく描画されない原因が知りたい。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

デバッグ

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

C++

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

0グッド

0クリップ

投稿2021/10/07 11:23

編集2021/10/08 04:01

提示コードですが頂点座標を正しく正方形に6個用意しているのにも関わず図形が正方形じゃなまたテクスチャも描画されない原因がわかりません。

参考サイト

参考サイト: http://www.opengl-tutorial.org/jp/beginners-tutorials/tutorial-5-a-textured-cube/

調べたこと

画像は読み込めてます。
頂点座標は正方形です。
glEnable()しているのでテクスチャは有効です。

Github: https://github.com/Shigurechan/GL
イメージ説明

#include "../header/Sprite.hpp" #include <array> #include "../header/Render.hpp" #include "../header/VertexData.hpp" #include "../header/Shader.hpp" #include "../header/Resource.hpp" #include "../header/VertexData.hpp" #include "../header/Init.hpp" #include "../header/Shader.hpp" #include "../header/Window.hpp" #include "../header/Camera.hpp" // ##################################### コンストラクタ ##################################### FrameWork::Sprite::Sprite(const char* vert, const char* frag) : Render_2D() { glEnable(GL_TEXTURE_2D); shader->Input(FrameWork::LoadShader("Shader/2D/BasicTexture_2D.vert")->data(),FrameWork::LoadShader("Shader/2D/BasicTexture_2D.frag")->data()); //vao glGenVertexArrays(1, &vao); glBindVertexArray(vao); //vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); vertex = FrameWork::Camera_2D::getVertexAttribute(); //頂点 GLint attrib = shader->getAttribLocation("vertexPosition"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(VertexAttribute), vertex->data(), GL_DYNAMIC_DRAW); glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)0); shader->setBindAttribLocation("vertexPosition"); //UV attrib = shader->getAttribLocation("vertexUV"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(VertexAttribute), vertex->data(), GL_DYNAMIC_DRAW); glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); shader->setBindAttribLocation("vertexUV"); /* //Normal attrib = shader->getAttribLocation("vertexNormal"); glEnableVertexAttribArray(attrib); glBufferData(GL_ARRAY_BUFFER, vertex->size() * sizeof(VertexAttribute), vertex->data(), GL_DYNAMIC_DRAW); glVertexAttribPointer(attrib, 4, GL_FLOAT, GL_FALSE, 11 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 4)); shader->setBindAttribLocation("vertexNormal"); printf("ddddddddd\n"); */ texture.clear(); //テクスチャデータ } // ##################################### テクスチャ 設定 ##################################### void FrameWork::Sprite::InputTexture(FrameWork::TextureFile tex) { //glPixelStorei(GL_PACK_ALIGNMENT, 4); //glPixelStorei(GL_UNPACK_ALIGNMENT, 1); Texture data; data.size = tex.size; data.data = tex.fileData; // printf("data.size.x %f\n",data.size.x); // printf("data.size.y %f\n\n",data.size.y); // printf("data.data %d\n\n",data.data); texture.push_back(data); //テクスチャーIDに追加 glGenTextures(1, &texture.back().ID); //テクスチャIDの生成 glBindTexture(GL_TEXTURE_2D, texture.back().ID); //IDをバインド // テクスチャの補間設定 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //テクスチャ生成 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texture.back().size.x, texture.back().size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, texture.back().data); texture.back().unitNumber = GL_TEXTURE0 + (int)textureUnitCount; //テクスチャユニットを設定できない場合はエラー assert(texture.back().unitNumber < GL_TEXTURE31); // printf("data.size.x %f\n",texture.back().size.x); // printf("data.size.y %f\n\n",texture.back().size.y); textureUnitCount++; //テクスチャーユニットカウントに加算 } // ##################################### 頂点属性 ##################################### void FrameWork::Sprite::setAttribute() { // 頂点座標 vertex->at(0).position[0] = -0.5f; vertex->at(0).position[1] = 0.5f; vertex->at(1).position[0] = -0.5f; vertex->at(1).position[1] = -0.5f; vertex->at(2).position[0] = 0.5f; vertex->at(2).position[1] = 0.5f; vertex->at(3).position[0] = 0.5f; vertex->at(3).position[1] = 0.5f; vertex->at(4).position[0] = -0.5f; vertex->at(4).position[1] = -0.5f; vertex->at(5).position[0] = 0.5f; vertex->at(5).position[1] = -0.5f; // printf("texture.at(textureNumber).size.x %f\n",texture.at(textureNumber).size.x); //printf("texture.at(textureNumber).size.y %f\n\n",texture.at(textureNumber).size.y); //UV座標 float sizeX = 1.0f / (float)texture.at(textureNumber).size.x; float sizeY = 1.0f / (float)texture.at(textureNumber).size.y; //printf("sizeX %f\n",sizeX); //printf("sizeY %f\n\n",sizeY); vertex->at(0).uv[0] = sizeX * startSize.x; vertex->at(0).uv[1] = sizeY * endSize.y; vertex->at(1).uv[0] = sizeX * startSize.x; vertex->at(1).uv[1] = sizeY * startSize.y; vertex->at(4).uv[0] = sizeX * startSize.x; vertex->at(4).uv[1] = sizeY * startSize.y; vertex->at(2).uv[0] = sizeX * endSize.x; vertex->at(2).uv[1] = sizeY * endSize.y; vertex->at(3).uv[0] = sizeX * endSize.x; vertex->at(3).uv[1] = sizeY * endSize.y; vertex->at(5).uv[0] = sizeX * endSize.x; vertex->at(5).uv[1] = sizeY * startSize.y; } // ##################################### 法線 設定 ##################################### void FrameWork::Sprite::setNormal(std::array<glm::vec3, 6> n) { vertex->at(0).normal[0] = n.at(0).x; vertex->at(0).normal[1] = n.at(0).y; vertex->at(0).normal[2] = n.at(0).z; vertex->at(1).normal[0] = n.at(1).x; vertex->at(1).normal[1] = n.at(1).y; vertex->at(1).normal[2] = n.at(1).z; vertex->at(2).normal[0] = n.at(2).x; vertex->at(2).normal[1] = n.at(2).y; vertex->at(2).normal[2] = n.at(2).z; vertex->at(3).normal[0] = n.at(3).x; vertex->at(3).normal[1] = n.at(3).y; vertex->at(3).normal[2] = n.at(3).z; vertex->at(4).normal[0] = n.at(4).x; vertex->at(4).normal[1] = n.at(4).y; vertex->at(4).normal[2] = n.at(4).z; vertex->at(5).normal[0] = n.at(5).x; vertex->at(5).normal[1] = n.at(5).y; vertex->at(5).normal[2] = n.at(5).z; } // ##################################### 描画指定 ##################################### void FrameWork::Sprite::Draw(glm::vec2 pos, int texNum, float r, glm::vec2 s, glm::vec2 start, glm::vec2 end) { glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); startSize = start; //テクスチャ始点 endSize = end; //テクスチャ終点 textureNumber = texNum; //テクスチャを指定 setAttribute(); //頂点属性 設定 glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(VertexAttribute) * vertex->size(),vertex->data()); //Transform setPosition(pos); //座標 setScale(s + glm::vec2(end - start)); //スケール setRotate(r); //回転 //描画 shader->setEnable(); shader->setUniformMatrix4fv("uTranslate", getMatTranslation()); shader->setUniformMatrix4fv("uRotate", getMatRotate()); shader->setUniformMatrix4fv("uScale", getMatScale()); shader->setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, FrameWork::windowContext->getSize().x, FrameWork::windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); shader->setDisable(); glActiveTexture(texture.at(textureNumber).unitNumber); //テクスチャを有効にする glBindTexture(GL_TEXTURE_2D, texture.at(textureNumber).ID); //テクスチャをバインド glDrawArrays(GL_TRIANGLES, 0, vertex->size()); //バインド解除 glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindTexture(GL_TEXTURE_2D, 0); } // ##################################### デストラクタ ##################################### FrameWork::Sprite::~Sprite() { }

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問