スポンサーリンク

OpenGL(GLSL)でfloat型のテクスチャを使う

rgbaがfloat[4]のテクスチャを使う。

 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, TEXWIDTH, TEXHEIGHT, 0,GL_RGBA, GL_FLOAT, texdata);

GL_RGBA32F,GL_RGBA,GL_FLOATを指定する。他はunsigned charの時と変わらない。

サンプル

#pragma comment(lib,"glew32s.lib")

#define GLEW_STATIC
#include <gl/glew.h>

#include <GL/glut.h>


GLuint ProgramID;
GLuint FragmentShaderID;
GLuint VertexShaderID;

typedef GLfloat rgba_t[4];  //テクスチャ用

typedef GLfloat points_t[3]; //モデルの座標用
typedef GLfloat texcoord_t[2];//テクスチャ座標用

const int P_COUNT = 4;

//頂点データ
GLuint vertexbuffer;
points_t position[P_COUNT];

//テクスチャ座標データ
texcoord_t texcoord[P_COUNT];
GLuint texcoordbuffer;

//テクスチャデータ
rgba_t texdata[P_COUNT];
GLuint textureID;

void prepare_buffers() {

  //テクスチャ(画像)作成
  // 2*2の画像
  texdata[0][0] = 1.0;
  texdata[0][1] = 0;
  texdata[0][2] = 0;
  texdata[0][2] = 0;

  texdata[1][0] = 0;
  texdata[1][1] = 1.0;
  texdata[1][2] = 0;
  texdata[0][2] = 0;
  texdata[0][2] = 0;

  texdata[2][0] = 0;
  texdata[2][1] = 0;
  texdata[2][2] = 1.0;
  texdata[0][2] = 0;

  texdata[3][0] = 1.0;
  texdata[3][1] = 1.0;
  texdata[3][2] = 1.0;
  texdata[0][2] = 0;

  //////////////////////////////////////////
  //////////////////////////////////////////

  //頂点座標の定義 (四角形)
  // いつもなら glVertex3fv等て指定するもの
  position[0][0] = -0.7;
  position[0][1] = 0.7;
  position[0][2] = 0;

  position[1][0] = -0.7;
  position[1][1] = -0.7;
  position[1][2] = 0;

  position[2][0] = 0.7;
  position[2][1] = -0.7;
  position[2][2] = 0;

  position[3][0] = +0.7;
  position[3][1] = +0.7;
  position[3][2] = 0;

  //////////////////////////////////////////
  //////////////////////////////////////////

  //テクスチャ座標の定義
  //いつもならglTexCoord2f等で指定するもの
  texcoord[0][0] = 0;
  texcoord[0][1] = 1;

  texcoord[1][0] = 0;
  texcoord[1][1] = 0;

  texcoord[2][0] = 1;
  texcoord[2][1] = 0;

  texcoord[3][0] = 1;
  texcoord[3][1] = 1;

  //////////////////////////////////////////
  //////////////////////////////////////////

  //テクスチャの作成
  // 普通のテクスチャ作成
  glGenTextures(1, &textureID);
  glBindTexture(GL_TEXTURE_2D, textureID);

  int TEXWIDTH = 2;  // 2*2の画素数
  int TEXHEIGHT = 2;

  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

  // テクスチャの割り当て
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, TEXWIDTH, TEXHEIGHT, 0,GL_RGBA, GL_FLOAT, texdata);

  // テクスチャを拡大・縮小する方法の指定
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

  //////////////////////////////////////////
  //////////////////////////////////////////

  //頂点バッファの作成
  glGenBuffers(1, &vertexbuffer);
  glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  glBufferData(GL_ARRAY_BUFFER, 3 * P_COUNT * sizeof(GLfloat), position, GL_STATIC_DRAW);

  //テクスチャ座標バッファの作成
  glGenBuffers(1, &texcoordbuffer);
  glBindBuffer(GL_ARRAY_BUFFER, texcoordbuffer);
  glBufferData(GL_ARRAY_BUFFER, 2 * P_COUNT * sizeof(GLfloat), texcoord, GL_STATIC_DRAW);

}

void display(void)
{
  glClearColor(0, 0, 0, 1);
  glClear(GL_COLOR_BUFFER_BIT);
  glDisable(GL_CULL_FACE);//カリングを無効にする


  ///////////////////////////////////
  // 行列の設定
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  gluPerspective(65, 1, 0.1, 10);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glTranslated(0.0, 0.0, -3);

  ///////////////////////////////////
  // シェーダを使う
  glUseProgram(ProgramID);

  ///////////////////////////////////
  // 頂点バッファを有効化
  glEnableVertexAttribArray(0);
  glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
  glVertexAttribPointer(
    0,          // 属性0
    3,          // 1要素の個数。GLfloatのx,y,zなので3
    GL_FLOAT,   // タイプ
    GL_FALSE,   // 正規化しない(データが整数型の時)
    0,          // ストライド
    (void*)0    // 配列バッファオフセット
  );

  ///////////////////////////////////
  //テクスチャ座標バッファの有効化
  glEnableVertexAttribArray(1);
  glBindBuffer(GL_ARRAY_BUFFER, texcoordbuffer);
  glVertexAttribPointer(
    1,          // 属性1
    2,          // 1要素の個数。GLfloatのu,vなので2
    GL_FLOAT,   // タイプ
    GL_FALSE,   // 正規化しない(データが整数型の時)
    0,          // ストライド
    (void*)0    // 配列バッファオフセット
  );


  ///////////////////////////////////
  // 四角形の描画
  glDrawArrays(GL_TRIANGLE_FAN, 0, P_COUNT);

  glDisableVertexAttribArray(0);
  glDisableVertexAttribArray(1);

  glFlush();
}

コメントを残す

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

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


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