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; }
回答1件
あなたの回答
tips
プレビュー