#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib,"glew32.lib")
#include <gl/glew.h>
#include <GL/freeglut/freeglut.h>
#include "PNG.h"
#define WIDTH 320
#define HEIGHT 240
GLuint VboId[4];//4つ分
float angle=0.0f;
GLuint texID;
TEXTURE *texture;
//頂点データ 3面を4頂点で作成する 1頂点はx,y,zの3要素
GLfloat Vertex[3][4][3] ={
{{1.0f,0.0f,0.0f},{1.0f,0.0f,1.0f},{0.0f,1.0f,1.0f},{0.0f,1.0f,0.0f}},//1枚目
{{1.0f,0.0f,0.0f},{1.0f,0.0f,1.0f},{-1.0f,0.0f,1.0f},{-1.0f,0.0f,0.0f}},//2枚目
{{-1.0f,0.0f,0.0f},{-1.0f,0.0f,1.0f},{0.0f,1.0f,1.0f},{0.0f,1.0f,0.0f}},//3枚目
};
GLfloat Normal[3][4][3] ={
{{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f}},//右上
{{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f}},//下
{{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f}},//左上
};
GLfloat Color[3][4][3] ={
{{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f}},//赤
{{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f}},//青
{{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f}},//緑
};
GLfloat UV[3][4][2] ={
{{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},
{{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},
{{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},
};
void DrawArray(void)
{
//データの場所を知らせる
//座標
glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
glVertexPointer(3, GL_FLOAT, 0, 0);
//法線
glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
glNormalPointer(GL_FLOAT, 0, 0);
//色
glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
glColorPointer(3,GL_FLOAT, 0, 0);
//UV
glBindBuffer(GL_ARRAY_BUFFER,VboId[3]);
glTexCoordPointer(2,GL_FLOAT, 0, 0);
//有効化
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnable(GL_TEXTURE_2D);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_QUADS,0,4*3); //描画(4頂点*3面)
//無効化
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0,0,WIDTH,HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 200.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);
glRotatef(angle,1.0f,0.0f,0.0f);//回転
glRotatef(angle,0.0f,1.0f,0.0f);//回転
DrawArray();
glutSwapBuffers();
}
void idle(void)
{
angle+=0.2f;
Sleep(1);
glutPostRedisplay();
}
void Init(){
glewInit();
glClearColor(1.0, 1.0, 1.0, 1.0);
glEnable(GL_DEPTH_TEST);
glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);
glEnable(GL_COLOR_MATERIAL);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHTING);
glEnable(GL_NORMALIZE);//法線の正規化
glGenBuffers(4,&VboId[0]);//座標、法線、色,UVの4つ
//頂点
glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);
glBufferData(GL_ARRAY_BUFFER,sizeof(Vertex),
Vertex,GL_DYNAMIC_DRAW);
//法線
glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);
glBufferData(GL_ARRAY_BUFFER,sizeof(Normal),
Normal,GL_DYNAMIC_DRAW);
//色
glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);
glBufferData(GL_ARRAY_BUFFER,sizeof(Color),
Color,GL_STREAM_DRAW);
//UV
glBindBuffer(GL_ARRAY_BUFFER,VboId[3]);
glBufferData(GL_ARRAY_BUFFER,sizeof(UV),
UV, GL_DYNAMIC_DRAW);
//テクスチャを作成
texture = new TEXTURE("sample.png");
glGenTextures(1, (GLuint *)&texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glEnable(GL_TEXTURE_2D);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,texture->Width,
texture->Height,
0,GL_RGBA, GL_UNSIGNED_BYTE, texture->image);
glDisable(GL_TEXTURE_2D);
}
int main(int argc, char *argv[])
{
glutInitWindowPosition(100, 100);
glutInitWindowSize(WIDTH, HEIGHT);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("VBO");
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return 0;
}
|