#include <iostream>
#include <string>
#include <fstream>
#include <gl/glew.h>
#include <gl/glut.h>
#include <cv.h>
#include <highgui.h>
#pragma comment (lib,"glew32.lib")
#pragma comment (lib,"cv200.lib")
#pragma comment (lib,"cxcore200.lib")
#pragma comment (lib,"highgui200.lib")
GLuint TexId;
const char *filename="box.png";
GLuint vShaderId;
GLuint fShaderId;
GLuint programId;
//テクスチャの読み込み
void LoadTexture()
{
cv::Ptr<IplImage> imgA = cvLoadImage(filename);
if(imgA.empty())
{
std::cerr << "Can't Load Image\n";
exit(0);
}
glGenTextures(1,&TexId);
glBindTexture(GL_TEXTURE_2D,TexId);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,
imgA->width,imgA->height,0,
GL_BGR,GL_UNSIGNED_BYTE,imgA->imageData);
}
//GLSLのセットアップ
void setUpGLSL()
{
//---- 頂点シェーダオブジェクトの作成 ----//
vShaderId = glCreateShader(GL_VERTEX_SHADER);
//.vertファイルの中身を全て読み込む
std::ifstream inputFile1("glsl.vert");
std::istreambuf_iterator<char> vdataBegin(inputFile1);
std::istreambuf_iterator<char> vdataEnd;
std::string fileData1(vdataBegin,vdataEnd);
const char *vfile = fileData1.c_str();
//ソースコードをシェーダオブジェクトに変換
glShaderSource(vShaderId, 1, &vfile,NULL);
glCompileShader(vShaderId);//コンパイル
//---- フラグメントシェーダオブジェクトの作成 ----//
fShaderId = glCreateShader(GL_FRAGMENT_SHADER);
//.fragファイルの中身を全て読み込む
std::ifstream inputFile2("glsl.frag");
std::istreambuf_iterator<char> fdataBegin(inputFile2);
std::istreambuf_iterator<char> fdataEnd;
std::string fileData2(fdataBegin,fdataEnd);
const char *ffile = fileData2.c_str();
//ソースコードをシェーダオブジェクトに変換
glShaderSource(fShaderId, 1, &ffile,NULL);
glCompileShader(fShaderId);//コンパイル
//プログラムオブジェクトの作成
programId = glCreateProgram();
glAttachShader(programId,vShaderId);
glAttachShader(programId,fShaderId);
GLint linked;
glLinkProgram(programId);
glGetProgramiv(programId, GL_LINK_STATUS, &linked);
if(linked == GL_FALSE)
{
std::cerr << "Link Err.\n";
}
glUseProgram(programId);
//変数名texture0には「0」が入っている
glUniform1i(glGetUniformLocation(programId, "texture0"), 0);//テクスチャユニット0とする
}
void display()
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(3,4,5,0,0,0,0,1,0);
glColor3f(1,0,1);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, TexId);
glutSolidTeapot(1);
glBindTexture(GL_TEXTURE_2D, 0);
glutSwapBuffers();
}
void reshape(int w, int h)
{
glViewport(0,0,w,h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30,double(w)/h,0.1,200);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void keyboard(unsigned char key, int x, int y)
{
if(key == 'q')
{
glDeleteTextures(1,&TexId);
glDeleteShader(vShaderId);
glDeleteShader(fShaderId);
glDeleteProgram(programId);
exit(0);
}
}
void init()
{
glClearColor(1,1,1,1);
glEnable(GL_DEPTH_TEST);
}
int main(int argc, char **argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
glutInitWindowSize(640,480);
glutCreateWindow("Basic Texture Mapping");
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutKeyboardFunc(keyboard);
init();
glewInit();
if (!glewIsSupported("GL_VERSION_2_0"))
{
std::cerr << "Can't Use GLSL\n";
return -1;
}
LoadTexture();//テクスチャの読み込み
setUpGLSL();
glutMainLoop();
return 0;
}