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

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

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

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

C++

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

解決済

glActiveTexture();関数を使ってテクスチャを切り替えられない。

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

2回答

0グッド

0クリップ

1680閲覧

投稿2021/05/29 11:40

編集2021/06/08 06:53

提示コードのDrawGprah();関数部ですがunsigned char texNum引数に1と設定すると画像が描画されません。提示コードの////////コメント内部のコードですがglAcitveTexture();関数に入れている値を確認しましたがしっかりと値が入っていました。これはなぜなのでしょうか?
setTexture(TextureData tex)関数で画像を読み込みます。
仕様: unsigned char texNum 引数でテクスチャユニット番号を選択して描画するという仕様です。

Github: https://github.com/Shigurechan/OpenGL_FrameWork/tree/4714ff0f7c8992cf5cc18d0becdc405d05d5becb
[Sprite.cpp 部]

イメージ説明

cpp

1#include "Sprite.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#include "Texture.hpp" 11#include "Shader.hpp" 12#include "Window.hpp" 13#include "stb/stb_image.h" 14 15 16//コンストラクタ 17FrameWork::Sprite::Sprite(std::shared_ptr<Window> w,const char* vert,const char* frag) : Transform_2D(),Shader() 18{ 19 windowContext = w; //ウインドウコンテキスト 20 21 22 //シェーダー読み込み 23 if (vert == NULL && frag == NULL) 24 { 25 vert = "Shader/2D/BasicTexture_2D.vert"; 26 frag = "Shader/2D/BasicTexture_2D.frag"; 27 LoadShader(vert, frag); //シェーダーロード 28 29 isDefaultShader = true; 30 } 31 else 32 { 33 LoadShader(vert, frag); 34 35 isDefaultShader = false; 36 37 } 38 39 //テクスチャ関係 40 textureID = std::vector<TextureData>(0); //テクスチャーデータ 41 textureUnitCount = 0; //テクスチャユニット数をカウント 42 43 //vao 44 glGenVertexArrays(1, &vao); 45 glBindVertexArray(vao); 46 47 //vbo 48 glGenBuffers(1, &vbo); 49 glBindBuffer(GL_ARRAY_BUFFER, vbo); 50 51 //頂点 52 GLint attrib = getAttribLocation("vertexPosition"); 53 glEnableVertexAttribArray(attrib); 54 //glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_STATIC_DRAW); 55 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 56 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)0); 57 setBindAttribVertex("vertexPosition"); 58 59 //UV 60 attrib = getAttribLocation("vertexUV"); 61 glEnableVertexAttribArray(attrib); 62 //glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_STATIC_DRAW); 63 glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(VertexUV), rectangleVertex, GL_DYNAMIC_DRAW); 64 glVertexAttribPointer(attrib, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(GLfloat), (GLvoid*)(sizeof(GLfloat) * 2)); 65 setBindAttribVertex("vertexUV"); 66 67 68 //アルファブレンド有効 69 glEnable(GL_BLEND); 70 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 71} 72 73 74// ######################################## メンバ関数 ######################################## 75 76//テクスチャ設定 77void FrameWork::Sprite::setTexture(TextureData tex) 78{ 79 80 textureID.push_back(tex); //テクスチャーIDに追加 81 82 83 glGenTextures(1, &textureID.back().ID); //テクスチャIDの生成 84 85 //バインド 86 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 87 glBindTexture(GL_TEXTURE_2D, textureID.back().ID); 88 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, textureID.back().size.x, textureID.back().size.y, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureID.back().fileData); 89 90 // テクスチャの補間設定 91 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 92 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 93 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 94 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 95 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 96 97 textureID.back().textureUnitNumber = GL_TEXTURE0 + (int)textureUnitCount; 98 assert(textureID.back().textureUnitNumber < GL_TEXTURE31);//エラー表示 99 100 textureUnitCount++; //テクスチャーユニットカウントに加算 101} 102/////////////////////////////////////////////////////////////////////////////////////////////////// 103//描画するアクティブなテクスチャに指定 104void FrameWork::Sprite::setDrawTextureID(unsigned char id) 105{ 106 //assert(id < textureID.size()); 107 glActiveTexture(textureID.at(id).textureUnitNumber); 108 //std::cout << textureID.at(id).ID << std::endl; 109// std::cout << textureID.at(id).textureUnitNumber << std::endl; 110 111} 112/////////////////////////////////////////////////////////////////////////////////////////////////// 113//描画 114void FrameWork::Sprite::DrawGraph(glm::vec2 pos, unsigned char texNum,float r,glm::vec2 s,glm::vec2 startSize,glm::vec2 endSize) 115{ 116 if (isDefaultShader == true) 117 { 118 setEnable(); 119 } 120 121 setDrawTextureID(texNum); //テクチャーユニットを設定 122 123 glBindVertexArray(vao); 124 glBindBuffer(GL_ARRAY_BUFFER, vbo); 125 126 127 // ####################### 頂点属性のUVデータを更新 ####################### 128 // 129 //UVサイズからピクセルサイズを算出 130 const float sizeX = 1.0f / (float)textureID.at(texNum).size.x; 131 const float sizeY = 1.0f / (float)textureID.at(texNum).size.y; 132// std::cout << "aaa" << (float)textureID.at(texNum).size.x << std::endl; 133 134 //左上 135 rectangleVertex[0].uv[0] = sizeX * startSize.x; 136 rectangleVertex[0].uv[1] = sizeY * endSize.y; 137 138 //左下 139 rectangleVertex[1].uv[0] = sizeX * startSize.x; 140 rectangleVertex[1].uv[1] = sizeY * startSize.y; 141 rectangleVertex[4].uv[0] = sizeX * startSize.x; 142 rectangleVertex[4].uv[1] = sizeY * startSize.y; 143 144 //右上 145 rectangleVertex[2].uv[0] = sizeX * endSize.x; 146 rectangleVertex[2].uv[1] = sizeY * endSize.y; 147 rectangleVertex[3].uv[0] = sizeX * endSize.x; 148 rectangleVertex[3].uv[1] = sizeY * endSize.y; 149 150 //右下 151 rectangleVertex[5].uv[0] = sizeX * endSize.x; 152 rectangleVertex[5].uv[1] = sizeY * startSize.y; 153 154 155 156 157 158 159 160 161 glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(VertexUV) * 6, rectangleVertex); 162 // ################################################### 163 164 165 166 //std::cout << windowContext->getSize().x << std::endl; 167 168 //Transform 169 //printf("%f\n", rectangleVertex[2].uv[0]); 170 setSizeScale(glm::vec2(std::abs((endSize.x - startSize.x)), (std::abs(endSize.y - startSize.y)))); //サイズ 171 setScale(s); //スケール 172 setRotate(r); //回転 173 setTranslate(glm::vec3(pos.x + (getSizeScale().x / 2.0f), pos.y + (getSizeScale().y / 2.0f), 0.0f)); //平行移動 174 175 //uniform 176 setUniformMatrix4fv("uTranslate", translate); 177 setUniformMatrix4fv("uRotate", rotate); 178 setUniformMatrix4fv("uScale", scale); 179 setUniformMatrix4fv("uViewProjection", glm::ortho(0.0f, windowContext->getSize().x, windowContext->getSize().y, 0.0f, -1.0f, 1.0f)); 180 181 182 183 184 //バインド&描画 185 glBindTexture(GL_TEXTURE_2D, textureID.at(texNum).ID); 186 glDrawArrays(GL_TRIANGLES, 0, 6); 187 188 189 190 191 if (isDefaultShader == true) 192 { 193 setDisable(); 194 } 195 196 //バインドを解除 197 glBindVertexArray(0); 198 //glBindBuffer(GL_ARRAY_BUFFER, 0); 199 glBindTexture(GL_TEXTURE_2D, 0); 200 201} 202 203 204//デストラクタ 205FrameWork::Sprite::~Sprite() 206{ 207 208 //std::cout << "デストラクタ" << std::endl; 209 210 //テクスチャーIDを開放 211 for (int i = 0; i < textureID.size(); i++) 212 { 213 glDeleteTextures(1,&textureID.at(i).ID); 214 215 stbi_image_free(textureID.at(i).fileData); 216 textureID.at(i).fileData = NULL; 217 218 219 220 } 221 222 glDeleteVertexArrays(1, &vao); 223 glDeleteBuffers(1, &vbo); 224 225} 226 227

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

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

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

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

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

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

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

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

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

2021/06/01 05:25依頼された後にこの質問は修正されています

こちらの質問が複数のユーザーから「過去の低評価」という指摘を受けました。

退会済みユーザー

退会済みユーザー

2021/05/30 03:22

「glGetError()」による確認は行ってないんですか? 「glActiveTexture()」の引数に何を指定するかわかってますか? というか「glActiveTexture()」がどんな関数か理解してますか?
退会済みユーザー

退会済みユーザー

2021/05/31 09:51

はい。わかっているのですがなぜでないのでしょうか?値は入っています。
退会済みユーザー

退会済みユーザー

2021/06/01 01:42 編集

「setDrawTextureID(texNum);」をコメントアウトして、それっぽく動いたりしませんか?

回答2

0

「glActiveTextrue がどうの」という雰囲気から察するに,

テクスチャの切替を
「シェーダで用いるテクスチャユニットの単位で切り替える」形で実現しようとしているのかな? と推測しますが,
そうであれば,当然ながら「切替え」のために必要な情報がシェーダに伝わる必要があると思うのですが,提示コードにはそれらしい処理が見当たりません.

そのあたり
(シェーダで用いているテクスチャユニットと,PC側コードがいじくっているテクスチャユニットが一致していない)
が問題なのではないでしょうか.


要は,
【シェーダで色の決定に用いるテクスチャユニットを切り替える】のであれば,
シェーダ側に何かしらその旨の情報を伝える必要があるだろうから,
「切替処理」というのは,glUniformなんちゃら を使う形になるのではないかな,と.

そうではなくて,【シェーダが用いるテクスチャユニットに対して glBindTexture を行うことで「切替処理」を行う】のであれば,
glBindTexture だけを素直に呼んでればいいのでは.

投稿2021/06/01 06:03

編集2021/06/01 06:11
fana

総合スコア10645

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

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

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

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

0

ベストアンサー

具体的な呼び出し方がわかりませんが。
「setTexture()」を複数回呼び出したとして、その画像を0からのインデックスで指定することを想定します。
その場合、「setDrawTextureID(texNum)」の呼び出し自体が不要でしょう。

投稿2021/06/01 01:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

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

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

回答へのコメント

退会済みユーザー

退会済みユーザー

2021/06/07 04:02 編集

unsigned char texNum 引数でテクスチャユニット番号を選択して描画するという仕様です。
退会済みユーザー

退会済みユーザー

2021/06/07 06:27

この回答へのコメントではなく質問に追記してください。
fana

2021/06/08 08:31

「テクスチャユニットを選択」する話と,この回答でBAになっていることの間の繋がりがわからない.
退会済みユーザー

退会済みユーザー

2021/06/08 09:14

それっぽく動いたから、ヨシ、ということなんでしょうね
fana

2021/06/08 10:24

多分,私の回答の末尾の > glBindTexture だけを素直に呼んでればいいのでは. の状態になってるものと想像.

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

OpenGL

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

C++

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