変数の定義
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);
}