#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#pragma comment(lib, "glew32.lib")
#include <GL/glew.h>
#include <GL/freeglut/freeglut.h>
#include "GLSL.h"
#include "PNG.h"
#define WIDTH 640
#define HEIGHT 480
GLSL glsl;
GLuint texName[2];
TEXTURE *texture[2];
void texDraw(int NO,int x,int y,int width,int height){
glBindTexture(GL_TEXTURE_2D, texName[NO]);
glEnable(GL_TEXTURE_2D);//テクスチャ有効
glEnable(GL_ALPHA_TEST);//アルファテスト開始
glBegin(GL_POLYGON);
glTexCoord2f(0.0f, 1.0f); glVertex2d(x , y+height);//左下
glTexCoord2f(0.0f, 0.0f); glVertex2d(x , y);//左上
glTexCoord2f(1.0f, 0.0f); glVertex2d( x+width , y);//右上
glTexCoord2f(1.0f, 1.0f); glVertex2d( x+width , y+height);//右下
glEnd();
glDisable(GL_ALPHA_TEST);//アルファテスト終了
glDisable(GL_TEXTURE_2D);//テクスチャ無効
}
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);
texDraw(1,0,0,320,240);
glsl.ON();
GLint imageLoc = glGetUniformLocation(glsl.ShaderProg, "image");
glUniform1i(imageLoc, 0);
GLint imgWidthLoc = glGetUniformLocation(glsl.ShaderProg, "img_Width");
glUniform1i(imgWidthLoc, texture[2]->Width);
GLint imgHeightLoc = glGetUniformLocation(glsl.ShaderProg, "img_Height");
glUniform1i(imgHeightLoc, texture[2]->Height);
texDraw(2,320,0,320,240);
glsl.OFF();
glutSwapBuffers();
}
void idle(void)
{
glutPostRedisplay();
}
void TexCreate(int NO,char* FileName){
glGenTextures(1, &texName[NO]);
texture[NO] = new TEXTURE(FileName);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//テクスチャオブジェクトの作成
glBindTexture(GL_TEXTURE_2D, texName[NO]);
//テクスチャの指定
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,texture[NO]->Width,texture[NO]->Height,0,GL_RGBA,GL_UNSIGNED_BYTE,texture[NO]->image);
//テクスチャの繰り返し方法の指定
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);//GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);//GL_CLAMP);
//テクスチャを拡大・縮小する方法の指定
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);//NEAREST);
glBindTexture(GL_TEXTURE_2D, 0);
}
void Init(){
glClearColor(0.0, 0.0, 0.0, 1.0);
glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);
glsl.InitGLSL("vertex.shader","flagment.shader");
TexCreate(1,"sample.png");
TexCreate(2,"sample.png");
}
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;
}
|