固定機能:テクスチャマッピング

テクスチャマッピングと言っても、『画像を表示する』のチュートリアルで既にやっています。
ただ、今回は、より踏み込んでテクスチャのST座標を回転してみます。
それには、テクスチャマトリックスを使用します。
マトリックスと言えば、glMatrixMode(GL_PROJECTION); とか、glMatrixMode(GL_MODELVIEW);
が、あるように glMatrixMode(GL_TEXTURE); というテクスチャ用のマトリックスモードがあります。
このテクスチャ空間も,物体の空間 (x, y, z, w) と同じように4次元 (s, t, r, q)で用意されていて、
移動、回転、拡大縮小などの行列を適用できます。

 

ファイル
main.cpp

sample.png

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>
#include <stdio.h>
#include <gl/glpng.h>

#define WIDTH 320
#define HEIGHT 240

pngInfo info;
GLuint texture;

float anglez = 0.0f;

void display(void)
{
 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
 glOrtho(0.0, WIDTH, HEIGHT, 0.0, -1.0, 1.0);

 glMatrixMode(GL_TEXTURE);
  glLoadIdentity();
  glRotatef(anglez,0.0f,0.0f,1.0f);//Z軸を回転

 glEnable(GL_TEXTURE_2D);//テクスチャ有効
    glEnable(GL_ALPHA_TEST);//アルファテスト開始
    glBegin(GL_POLYGON);
 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 230);//左下
 glTexCoord2f(0.0f, 0.0f); glVertex2d(10 ,  10);//左上
 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 ,  10);//右上
 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 230);//右下
    glEnd();
    glDisable(GL_ALPHA_TEST);//アルファテスト終了
    glDisable(GL_TEXTURE_2D);//テクスチャ無効

 glutSwapBuffers();
}
void idle(void)
{
 anglez+=0.2f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.0, 0.0, 0.0, 1.0);
 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
 texture = pngBind ("sample.png", PNG_NOMIPMAP, PNG_ALPHA, &info, GL_CLAMP, GL_NEAREST, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

}
int main(int argc, char *argv[])
{
 glutInitWindowPosition(100, 100);
 glutInitWindowSize(WIDTH, HEIGHT);
 glutInit(&argc, argv);
 glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
 glutCreateWindow("テクスチャマトリックスで回転");
 glutDisplayFunc(display);
 glutIdleFunc(idle);
 Init();
 glutMainLoop();
 return 0;
}

 

 

 

 

 

 

 

最終更新:2015年01月25日 01:47
添付ファイル