スポンサーリンク

glTexImage2D internalformat vs format

format,typeはテクスチャとして用意したメモリの形式。

internalformatはそれをOpenGLがどのように使うかを指定する。

#include <iostream>
#include <array>

#include <Windows.h>

// GL_BGRなどを使うにはglew.hが必要。自分で定義してもいい
#include <GL/glew.h>
#include <gl/GL.h>


#include <gl/GLU.h>
#include <gl/freeglut.h>



GLuint texName;

//ウィンドウの幅と高さ
int width, height;

//描画関数
void disp(void) {

  glViewport(0, 0, width, height);

  glClearColor(0.2, 0.2, 0.2, 1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  //glEnable(GL_CULL_FACE);
  double v = 0.7;

  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, texName);

  glBegin(GL_QUADS);
  glTexCoord2f(0, 0); glVertex2f(-0.9, -0.9);
  glTexCoord2f(0, 1); glVertex2f(-0.9, 0.9);
  glTexCoord2f(1, 1); glVertex2f(0.9, 0.9);
  glTexCoord2f(1, 0); glVertex2f(0.9, -0.9);
  glEnd();


  glFlush();
}

//ウィンドウサイズの変化時に呼び出される
void reshape(int w, int h) {
  width = w; height = h;

  disp();
}

//エントリポイント
int main(int argc, char** argv)
{
  glutInit(&argc, argv);
  glutInitWindowPosition(100, 50);
  glutInitWindowSize(500, 500);
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);



  glutCreateWindow("sample");
  glutDisplayFunc(disp);
  glutReshapeFunc(reshape);

  glEnable(GL_TEXTURE_2D);
  glGenTextures(1, &texName);
  glBindTexture(GL_TEXTURE_2D, texName);
  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  
  const int TEXSIZE = 2;
  std::array<unsigned char, 3> texrgb[TEXSIZE * TEXSIZE];
  texrgb[0] = std::array<unsigned char, 3>{255, 0, 0 };
  texrgb[1] = std::array<unsigned char, 3>{ 0, 255, 0 };
  texrgb[2] = std::array<unsigned char, 3>{ 0, 0, 255};
  texrgb[3] = std::array<unsigned char, 3>{255, 128, 0};


#if 0
  // formatをGL_RGBにした場合

  glTexImage2D(
    GL_TEXTURE_2D, 0,
    GL_RGB, //  internalformat 
    TEXSIZE, TEXSIZE,0, 
    GL_RGB, // format
    GL_UNSIGNED_BYTE, &texrgb[0]
  );
#else
  // formatをGL_BGRにした場合

  glTexImage2D(
    GL_TEXTURE_2D, 0, 
    GL_RGB,  //  internalformat 
    TEXSIZE, TEXSIZE,0, 
    GL_BGR, // format
    GL_UNSIGNED_BYTE, &texrgb[0]
  );
#endif

  glutMainLoop();

  return 0;
}

上の例では、例えば{255,0,0}というデータを用意する。これをformatで「RGBの順にデータが並んでいますよ」と指定すると、internalformatで「RGBのテクスチャを使う」と指定してあるので、赤いドットとなる。

逆に、「BGRの順にデータが並んでいますよ」と指定すると、internalformatで「RGBのテクスチャを使う」と指定してあるので、BGRの順にデータが並んでいることを考慮し、青いドットとなる。

このように、「formatでデータの並び方を確認し、internalformatで指定した解釈でテクスチャとして利用する」ので、「formatで指定した形式からinternalformatで指定した形式に変換されている」といえる。

厄介なのがほとんどの場合この変換をしてくれないので、実質組み合わせが決まっているようなものになっている。

https://registry.khronos.org/OpenGL-Refpages/gl4/html/glTexImage2D.xhtml

コメントを残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: