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

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

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

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

C++

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

Q&A

解決済

1回答

3458閲覧

OpenGLを使った2D画像描画方法

hikar

総合スコア13

OpenGL

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

C++

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

0グッド

0クリップ

投稿2020/02/12 14:20

編集2020/02/16 03:01

Youtuberの「ゲーム道館」「OpenGL道場第19~20回」を参考にさせていただき、OpenGLを使った2D画像描画プログラムを製作しています
ゲーム道館さんの動画はとても面白く、参考にさせていた抱いています。(>_<)
その中で、少しわからなかったことがあったので質問させていただきました。

まず、画像描画までの過程として、
1・画像のファイルを開く(読み込み)
2・ビットマップファイルヘッダーを読み込む
3・ビットマップインフォヘッダーを読み込む
4・ポインタ型構造体(ピクセル情報)を生成し、全メンバを扱えるようにする。
5・malloc関数を使用しピクセル数分のメモリを確保しポインタ型構造体に代入
6・色情報を補正(変更)
7・画像を反転
8・OpenGLを使用し画像を描画
9・メモリ開放

2・3・5・8がわかりません。

・・・・・・・・・・・・・・・・・・・・2・・・・・・・・・・・・・・・・・・・・・
「BITMAPFILEHEADER bf」はヘッダーのデータを格納する構造体とゲーム道館館長さんがおっしゃっていました。
ビットマップ画像とは、ピクセルを用いたもの(座標と色)
ヘッダとはファイルなどの先頭にあるデータである。
コンピュータはデータを処理する際に、まずヘッダの情報を読み取り、そのデータを処理する方法を判断する。
これはfopen_sで読み込んだ画像データの色情報をBITMAPFILEHEADER bfを使い構造体に格納しているのでしょうか?

・・・・・・・・・・・・・・・・・・・・3・・・・・・・・・・・・・・・・・・・・・
2の質問と同じようになってしまいますが...
BITMAPINFOHEADER biをネットで調べてみた結果、色情報を格納すると記述されていました。
ん~上と一緒
また、BITMAPFILEHEADER bfはBITMAPINFOHEADER biを使用できるようにするための宣言と書いてある記事もありました。どうなのでしょうか?
どのように使って、何が格納されるのか教えてください<(_ _)>

・・・・・・・・・・・・・・・・・・・・5・・・・・・・・・・・・・・・・・・・・・

typedef struct { unsigned char r, g, b; }RGB; RGB* pixels = (RGB*)malloc(sizeof RGB * bi.biWidth * bi.biHeight); fread(pixels, //格納先のバファ sizeof RGB, //読み込むデータ1つのバイト数 bi.biWidth* bi.biHeight,//読み込むデータの個数 pFile); //ファイルポインタ

ポインタ構造体変数で全メンバを扱えるようmalloc関数を使用しメモリをピクセル数分確保する。まではわかるのですが。
その変数にfreadを使用しどのようなデータが格納され、どのようにpixelsにデータが格納されるのでしょうか?

初めにfopen_sで読み込んだ画像情報の色情報を、pixelsに、一ピクセル3色分RGBのデータを画像分、格納する。と思ったのですが、そしたら2・3の意味がなくなってしまうのではないかな~と思いました。

そして、pixelsにはどのように格納されているのでしょうか?
ピクセルがRGBの3色分であり、1ピクセルにはRGBの順で色情報が並んでおり、それに伴い、pixelsのrgbに確保したメモリ分格納できる?
イメージ説明
画像が汚く本当にすみません。
マウスパッドで書いたから仕方が...

構造体のポインタ変数があまりわからないのですが、なぜこんなにも多くのデータを配列でもないのにかくのうできるのでしょうか?
malloc関数を使用しメモリを確保しているからでしょうか?

・・・・・・・・・・・・・・・・・・・・8・・・・・・・・・・・・・・・・・・・・・
「glTexParameteri()」関数を使いテクスチャマッピングを行う際の種々のパラメータの設定を行うそうなのですが、下のソースコードを見て頂いたらわかると思うのですが、なぜglTexParameteri()関数を使いパラメータの設定をおこなうのでしょうか?
2回目のglTexParameteri()をコメントにしたら画像が消えてしまいましたし...

ポインタ構造体変数はどのような構造をしていて、freadを使用しどのようなデータが格納され、どのようにpixelsにデータが格納されるのか教えてください<(_ _)>

質問攻めになってしまいますが、どうかよろしくお願いします。<(_ _)>

C++

1#include <stdio.h> 2#include <Windows.h> 3 4#include "glut.h" 5 6#include "tex.h" 7 8int texFromBMP(const char* _fileName) { 9 FILE* pFile; 10 fopen_s(&pFile, _fileName, "rb"); 11 if (pFile == nullptr) { 12 printf("%s open failed!\n", _fileName); 13 return 1; 14 } 15 printf("%s opened.\n", _fileName); 16*2*\ 17 BITMAPFILEHEADER bf; //ヘッダーのデータを格納する構造体 18 fread(&bf, //格納先のバファ 19 sizeof BITMAPFILEHEADER,//読み込むデータ1つのバイト数 20 1, //読み込むデータの個数 21 pFile); //ファイルポインタ 22 printf("bfSize:%d\n", bf.bfSize); 23/*3*/ 24 BITMAPINFOHEADER bi; 25 fread(&bi, //格納先のバファ 26 sizeof BITMAPINFOHEADER,//読み込むデータ1つのバイト数 27 1, //読み込むデータの個数 28 pFile); //ファイルポインタ 29/*5*/ 30 typedef struct { 31 unsigned char r, g, b; 32 }RGB; 33 RGB* pixels = (RGB*)malloc(sizeof RGB * bi.biWidth * bi.biHeight); 34 fread(pixels, //格納先のバファ 35 sizeof RGB, //読み込むデータ1つのバイト数 36 bi.biWidth* bi.biHeight,//読み込むデータの個数 37 pFile); //ファイルポインタ 38 39 for (int y= 0; y < bi.biHeight; y++) { 40 for (int x = 0; x < bi.biWidth; x++) { 41 RGB* pPixel = &pixels[y * bi.biWidth + x]; 42 unsigned char temp = pPixel->r; 43 pPixel->r = pPixel->b; 44 pPixel->b = temp; 45 } 46 } 47 48 for (int y = 0; y < bi.biHeight/2; y++) 49 for (int x = 0; x < bi.biWidth; x++) { 50 RGB* pPixel0 = &pixels[y * bi.biWidth + x]; 51 RGB* pPixel1 = &pixels[(bi.biHeight -1-y )*bi.biWidth +x]; 52 RGB temp = *pPixel0; 53 *pPixel0 = *pPixel1; 54 *pPixel1 = temp; 55 56 } 57 58 glTexImage2D( 59 GL_TEXTURE_2D, // GLenum target 60 0, // GLint level 61 GL_RGB, // GLint internalformat 62 bi.biWidth,bi.biHeight, // GLsizei width, height 63 0, // GLint border 64 GL_RGB, // GLenum format 65 GL_UNSIGNED_BYTE, // GLenum type 66 pixels); // const GLvoid *pixels 67/*8*/ 68 glTexParameteri( 69 GL_TEXTURE_2D, // GLenum target 70 GL_TEXTURE_MAG_FILTER, // GLenum pname 71 GL_NEAREST); // GLint param 72 glTexParameteri( 73 GL_TEXTURE_2D, // GLenum target 74 GL_TEXTURE_MIN_FILTER, // GLenum pname 75 GL_NEAREST); // GLint param 76 77 free(pixels); 78 fclose(pFile); 79 80 return 0; 81}

追記

int pixecls_[25] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,12,22,13,14,15}; int* a = pixecls_; int main() { typedef struct { unsigned int r, g, b; }RGB2; RGB2* pixels2 = (RGB2*)malloc(sizeof RGB2 * 5 * 5); pixels2->b = *a; pixels2->g = *a; pixels2->r = *a; for (int i=0; i < 30;i++) { printf("pixels->r:%d ,pixels->g:%d ,pixels->b:%d\n", pixels->r+i, pixels->g+i, pixels->b+i); } return 0; }

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

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

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

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

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

nskydiving

2020/02/13 01:04

その「わからなかったこと」とは何でしょうか? 質問文が途中で切れてしまっていないでしょうか?
hikar

2020/02/13 14:04

ご返答ありがとうございます。なぜか、投稿したはずの質問が初期に戻っていました。 本当に申し訳ございません。<(_ _)> 修正させていただきました。 よろしくお願いします。(>_<)
guest

回答1

0

ベストアンサー

【2】【3】
BITMAPFILEHEADER、BITMAPINFOHEADER について、認識が誤っています。
以下URLを参照して、どのようなデータが格納されているのか確認してください。

Bitmapファイルフォーマット
http://www.umekkii.jp/data/computer/file_format/bitmap.cgi

【5】

ピクセルがRGBの3色分であり、1ピクセルにはRGBの順で色情報が並んでおり、それに伴い、pixelsのrgbに確保したメモリ分格納できる?

そのイメージで合っていると思います。

構造体のポインタ変数があまりわからないのですが、なぜこんなにも多くのデータを配列でもないのにかくのうできるのでしょうか?
malloc関数を使用しメモリを確保しているからでしょうか?

その通りです。

【8】

「glTexParameteri()」関数を使いテクスチャマッピングを行う際の種々のパラメータの設定を行うそうなのですが、下のソースコードを見て頂いたらわかると思うのですが、なぜglTexParameteri()関数を使いパラメータの設定をおこなうのでしょうか?

拡大時、縮小時のフィルタリング方法を指定しています。
詳細は以下URLを参照してください。

OpenGL ES2.0 入門 基礎編(テクスチャのパラメータ)
https://qiita.com/kazoo/items/27d2c18d14dbb99bebf3

glTexParameter
https://www.khronos.org/registry/OpenGL-Refpages/es2.0/xhtml/glTexParameter.xml

投稿2020/02/16 00:15

nskydiving

総合スコア6500

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

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

hikar

2020/02/16 03:47

ご返答ありがとうございました。とても分かりやすくて助かりました。(>_<) 教えていただいたサイトを参考にさせていただき、理解出来ました。 「BITMAPINFOHEADER 」を使用しpFileに保持した画像の色ビット数をbiに格納し、 それを基にmalloc関数を使用しメモリを確保する。 BITMAPINFOHEADER は画像の情報を多く所持していて、その値を変数に格納してあるから汎用性が高いということですね! そして次に、freadを使用し、pFileが保持している色情報をpixelsに格納しているということですね! それと追記でソースコードを記載させていただき、試行錯誤を繰り返し、上のようなソースコードにまとめてみました。 *pixelsに直で*aを代入するとエラーが出てしまいました。 代入の方法を変えてもみましたが、同じくエラーが出てしまい、上のソースコードのようにメンバに直で*aを代入するに至りました。 freadでは格納するpixels(r,g,b)にpFile内の色情報を格納するような計算があるということでしょうか? (例えば、上のソースコードの用にメンバに直に代入するような....) お手数をおかけしますが、何か参考になるサイトなどがありましたら、教えてください<(_ _)>
nskydiving

2020/02/16 11:32

ほとんどの回答者は同じ質問は一度しか閲覧しませんので、質問の追加や変更をしても回答を得られる可能性は低いです。 この質問は「解決済み」にして、別の質問として投稿することをおすすめします。
hikar

2020/02/16 14:55

ご返答ありがとうございます。<(_ _)> そのようにさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問