スポンサーリンク

GLSLを試す (3) テクスチャ

変数の定義

typedef GLubyte rgb_t[3];    //テクスチャ用
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;

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

データとバッファの準備

void prepare_buffers() {

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

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

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

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

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

  //頂点座標の定義 (四角形)
  // いつもなら 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_RGB, TEXWIDTH, TEXHEIGHT, 0,
    GL_RGB, GL_UNSIGNED_BYTE, 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();
}

頂点シェーダ

#version 460 core

layout (location = 0) in vec3 aPos;//ポリゴンの頂点座標
layout (location = 1) in vec2 texcd;//座標に対応するテクスチャ座標

out vec2 vTexCoord;//テクスチャ座標の出力先

uniform mat4 gl_ModelViewMatrix;
uniform mat4 gl_ProjectionMatrix;

void main()
{
  gl_Position = gl_ProjectionMatrix * gl_ModelViewMatrix * vec4(aPos, 1.0);
  vTexCoord = texcd;//フラグメントシェーダへテクスチャ座標を渡す
}

フラグメントシェーダ

#version 460 core

out vec4 FragColor;//色の出力先

uniform sampler2D uTex;//テクスチャデータ(自動でセットされている)
  
in vec2 vTexCoord;//頂点シェーダから渡されたテクスチャ座標

void main()
{
//テクスチャデータとテクスチャ座標から色を決定
FragColor = texture(uTex,vTexCoord); }

コメントを残す

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

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


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