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

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

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

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

C++

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

Q&A

解決済

1回答

954閲覧

glActiveTexture()を設定してもテクスチャが変わらない理由が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

投稿2021/05/04 01:43

setDrawTextureID(unsigned char id);関数部ですがなぜglActiveTexture関数を使ってテクスチャIDを設定しているにも関わらず表示されるテクスチャが1のままなのでしょうか?

参考サイト(テクスチャユニット説明部): https://learnopengl.com/Getting-started/Textures

イメージ説明
![イメージ説明

cpp

1#include "Sprite_2D.hpp" 2 3#include <iostream> 4#include <fstream> 5 6#include <glm/glm.hpp> 7#include <glm/gtc/matrix_Transform.hpp> 8#include <glm/gtx/Transform.hpp> 9 10 11#include "Shader.hpp" 12 13 14//コンストラクタ 15Sprite_2D::Sprite_2D(const char* vert,const char* frag) : Transform_2D(),Shader() 16{ 17 //シェーダー読み込み 18 LoadShader(vert, frag); 19 selectID = -1; 20 21 //頂点情報 22 Vertex rectangleVertex[6] = 23 { 24 //頂点、頂点色 25 {-0.5f,0.5f, 0.0f,1.0f}, 26 {-0.5f,-0.5f, 0.0f,0.0f}, 27 {0.5f,0.5f, 1.0f,1.0f}, 28 29 {0.5f,0.5f, 1.0f,1.0f}, 30 {-0.5f,-0.5f, 0.0f,0.0f}, 31 {0.5f,-0.5f, 1.0f,0.0f}, 32 }; 33 34 //vao 35 glGenVertexArrays(1, &vao); 36 glBindVertexArray(vao); 37 38 //vbo 39 glGenBuffers(1, &vbo); 40 glBindBuffer(GL_ARRAY_BUFFER, vbo); 41 42 //頂点 43 GLint attrib = getAttribLocation("vertexPosition"); 44 glEnableVertexAttribArray(attrib); 45 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 46 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)0); 47 setBindAttribVertex("vertexPosition"); 48 49 attrib = getAttribLocation("vertexUV"); 50 glEnableVertexAttribArray(attrib); 51 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(Vertex), rectangleVertex, GL_STATIC_DRAW); 52 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 53 setBindAttribVertex("vertexUV"); 54 55 56 //アルファブレンド有効 57 glEnable(GL_BLEND); 58 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 59} 60 61 62// ###################### メンバ関数 ###################### 63 64//テクスチャ設定 65void Sprite_2D::setTexture(TextureData tex) 66{ 67 68 textureID.push_back(tex); 69 70 71 glGenTextures(1, &textureID.back().ID); //テクスチャIDの生成 72 73 //バインド 74 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 75 glBindTexture(GL_TEXTURE_2D, textureID.back().ID); 76 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureID.back().size.x, textureID.back().size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureID.back().fileData); 77 78 // テクスチャの補間設定 79 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 80 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 81 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 82 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 83 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 84 85 setSizeScale(glm::vec3(textureID.back().size.x, textureID.back().size.y, 1.0f)); //スプライトサイズを設定 86 87 //自動で最後にロードしてテクスチャを描画するように設定 88 //glActiveTexture(textureID.back().ID); 89 selectID++; 90 91} 92 93// ###################### メンバ関数 ###################### 94 95//描画するテクスチャ番号を指定 96void Sprite_2D::setDrawTextureID(unsigned char id) 97{ 98 assert(id < textureID.size()); 99 selectID = id; 100 glActiveTexture(textureID.at(id).ID); 101 glBindTexture(GL_TEXTURE_2D, textureID.at(id).ID); 102 103} 104 105//描画 106void Sprite_2D::DrawGraph(glm::vec2 pos,glm::mat4 projection) 107{ 108 glBindVertexArray(vao); 109 glBindTexture(GL_TEXTURE_2D, textureID.at(selectID).ID); 110 111 setTranslate(glm::vec3(pos.x + (textureID.at(selectID).size.x / 2.0f), pos.y + (textureID.at(selectID).size.y / 2.0f), 0.0f)); //平行移動 112 113 //uniform 114 setUniformMatrix4fv("uTranslate", translate); 115 setUniformMatrix4fv("uRotate", rotate); 116 setUniformMatrix4fv("uScale", scale); 117 setUniformMatrix4fv("uViewProjection",projection); 118 119 glDrawArrays(GL_TRIANGLES, 0, 6); 120 121 122 glBindVertexArray(0); 123 glBindTexture(GL_TEXTURE_2D, 0); 124} 125 126//回転描画 127void Sprite_2D::DrawRotateGraph(glm::vec2 pos, float angle, glm::mat4 projection) 128{ 129 130 glBindVertexArray(vao); 131 glBindTexture(GL_TEXTURE_2D, textureID.at(selectID).ID); 132 133 setRotate(angle); //回転 134 setTranslate(glm::vec3(pos.x + (textureID.at(selectID).size.x / 2.0f), pos.y + (textureID.at(selectID).size.y / 2.0f), 0.0f)); //平行移動 135 136 //uniform 137 setUniformMatrix4fv("uTranslate", translate); 138 setUniformMatrix4fv("uRotate", rotate); 139 setUniformMatrix4fv("uScale", scale); 140 setUniformMatrix4fv("uViewProjection", projection); 141 142 glDrawArrays(GL_TRIANGLES, 0, 6); 143 144 glBindVertexArray(0); 145 glBindTexture(GL_TEXTURE_2D, 0); 146 147} 148 149//スケール描画 150void Sprite_2D::DrawExtendGraph(glm::vec2 pos, glm::vec2 s, glm::mat4 projection) 151{ 152 153 glBindVertexArray(vao); 154 glBindTexture(GL_TEXTURE_2D, textureID.at(selectID).ID); 155 156 setScale(s); //スケール 157 setTranslate(glm::vec3(pos.x + (textureID.at(selectID).size.x / 2.0f), pos.y + (textureID.at(selectID).size.y / 2.0f), 0.0f)); //平行移動 158 159 //Uniform 160 setUniformMatrix4fv("uTranslate", translate); 161 setUniformMatrix4fv("uRotate", rotate); 162 setUniformMatrix4fv("uScale", scale); 163 setUniformMatrix4fv("uViewProjection", projection); 164 165 166 glDrawArrays(GL_TRIANGLES, 0, 6); 167 168 glBindVertexArray(0); 169 glBindTexture(GL_TEXTURE_2D, 0); 170} 171 172 173 174//デストラクタ 175Sprite_2D::~Sprite_2D() 176{ 177 glDeleteVertexArrays(1, &vao); 178 glDeleteBuffers(1, &vbo); 179} 180 181

cpp

1 Sprite_2D sprite("Shader/BasicTexture_2D.vert","Shader/BasicTexture_2D.frag"); //表示オブジェクト 2 sprite.setTexture(LoadTexture("texture_1.png")); 3 sprite.setTexture(LoadTexture("texture_2.png")); 4 //sprite.Load("Shader/BasicMono_2D.vert", "Shader/BasicMono_2D.frag"); 5 6 7 8 glm::vec2 pos = glm::vec2(0, 0); 9 glm::vec2 scale = glm::vec2(0,0); 10 float angle = 0.0f; 11 12 while (*window) 13 { 14 glClearColor(0.0, 0.0, 1.0, 1.0); //カラーバッファのクリア色を設定 15 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //カラーバッファ指定色でクリア 16 17 sprite.setEnable(); 18 sprite.setDrawTextureID(1); 19 20 21 22 23 24 //sprite.setUniform4f("uFragment", glm::vec4(0.0, 0.0, 1.0, 1.0)); 25 26 sprite.DrawGraph(pos,camera->getProjection_2D()); 27 sprite.DrawRotateGraph(pos, angle, camera->getProjection_2D()); 28 sprite.DrawExtendGraph(pos,scale,camera->getProjection_2D()); 29 30 31 32 33 sprite.setDisable(); 34 35 36 window->SwapBuffers(); //ダブルバッファリング 37 } 38 39} 40

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

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

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

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

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

guest

回答1

0

ベストアンサー

LoadTexture()の処理が不明だったため、該当しそうな箇所をGitHubのリポジトリから探しました。

「fileName」を使わず、「"texture_1.png"」固定になっていますが、大丈夫でしょうか。

該当箇所

cpp

1TextureData LoadTexture(const char* fileName) 2{ 3 TextureData data; 4 data.fileData = NULL; 5 data.fileData = stbi_load("texture_1.png", &data.size.x, &data.size.y, &data.channel, 0); 6 7 assert(data.fileData); 8 9 return data; 10}

投稿2021/05/04 04:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2021/05/04 04:40

正直なところ、ライブラリの処理を疑うならまず、説明などの確認と、 再現する最小の構成で確認してみてからにしてくれとは思いますが。
退会済みユーザー

退会済みユーザー

2021/05/04 07:14

なるほど。見落としてました。 また関数を以下のようにして解決しました。 //描画するテクスチャ番号を指定 void Sprite_2D::setDrawTextureID(unsigned char id) { assert(id < textureID.size()); selectID = id; glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureID.at(selectID).size.x, textureID.at(selectID).size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureID.at(selectID).fileData); glBindTexture(GL_TEXTURE_2D, textureID.at(selectID).ID); glActiveTexture(GL_TEXTURE0); }
退会済みユーザー

退会済みユーザー

2021/05/04 07:57

そこに「glTexImage2D()」を追加したのはなぜでしょうか。 「glActiveTexture(GL_TEXTURE0);」と最後に呼び出し、0番目固定にしている理由はなんでしょうか。 それぞれの関数が動くか理解して変更していますか? 「glActiveTexture()」、「glBindTexture()」、「glTexImage2D()」の呼び出し方から、 その部分の理解が足りていないのではないかと思います。 気になったのですが根っこの目的は何でしょうか。 ゲームを作りたいということであれば、こんな本質以外の箇所で詰まるのも時間の無駄なので、 ゲームエンジンを使用する方がいいと思います。 DXライブラリ、Unity、UE4、Cocos2d、libGDX、Godotなど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問