//テクスチャ識別子にファイルから読み込んだデータを与える bool setupTexture(const GLuint id, const char* file, int width, int height){ //ファイルをバイナリモードで開く std::ifstream fstr(file, std::ios::binary); if(!fstr) return false; //ファイルサイズを取得 const size_t file_size = static_cast<size_t>(fstr.seekg(0, fstr.end).tellg()); //読み込み位置をファイルの先頭に戻す fstr.seekg(0, fstr.beg); //動的配列を使ってファイルを読み込む場所を確保する std::vector<char> texture_buffer(file_size); //確保した場所へファイルを読み込む fstr.read(&texture_buffer[0], file_size); //テクスチャ識別子に対して指示を与える glBindTexture(GL_TEXTURE_2D, id); //1ピクセルに3色と透明度の情報を持つ, ピクセルの画像データをopenglに転送する glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, &texture_buffer[0]); //画像が拡大された時の振る舞いを指定する glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //テクスチャの丸め込み方法を指定する glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); return true; }
bool setupTexture(const GLuint id, const char* file, const int width, const int height){ std::ifstream fstr(file,std::ios::binary); if(!fstr) { return false; } //ファイルの最初から最後まで読み込んだときのサイズ? const size_t file_size = static_cast<size_t> (fstr.seekg(0,fstr.end).tellg()); //開始位置に戻す fstr.seekg(0, fstr.beg); //画像がなんでchar型のvecterに保存できる /* ★CHAR = char 1バイト(8ビット) -128~127 ★BYTE = unsigned char 1バイト(8ビット) 0~255 */ //byteではだめか?後ほど試してみる std::vector<char> texture_buffer(file_size); fstr.read(&texture_buffer[0],file_size); glBindTexture(GL_TEXTURE_2D,id); //1ピクセルに赤,翠,青,αの情報 //幅256,高さ256 転送 //2Dて関数名に書いてあるのになんでわざわざ引数で指定しなきゃならんのか? glTexImage2D( GL_TEXTURE_2D, 0, //テクスチャをOpenGL内部で保持する形式? GL_RGBA, width ,height, 0, //引数pixelsに指定したメモリ上の画像形式? GLでのテクスチャの保持と画像保持は別もの・ GL_RGBA, GL_UNSIGNED_BYTE, &texture_buffer[0] ); //画像拡大時の振る舞い glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); //画像が縮小された場合の振る舞い glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //丸め込み方法 //色々試すと面白い glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_MIRRORED_REPEAT ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_MIRRORED_REPEAT ); return true; }