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

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

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

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

C++

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

Q&A

解決済

2回答

2214閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

OpenGL

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

C++

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

0グッド

0クリップ

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/05/30 03:22

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

退会済みユーザー

2021/05/31 09:51

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

退会済みユーザー

2021/06/01 01:42 編集

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

回答2

0

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

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

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


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

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

投稿2021/06/01 06:03

編集2021/06/01 06:11
fana

総合スコア11996

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

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

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 だけを素直に呼んでればいいのでは. の状態になってるものと想像.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問