#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>
#include <stdio.h>
#include "PNG.h"
#define WIDTH 640
#define HEIGHT 480
GLuint texName[2];
TEXTURE *texture[2];
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);
glRasterPos2i(0 , 0);
glPixelZoom( 1.0f, -1.0f );
glDrawPixels(texture[1]->Width,texture[1]->Height,GL_RGBA,GL_UNSIGNED_BYTE,texture[1]->image);
glRasterPos2i(320 , 0);
glDrawPixels(texture[2]->Width,texture[2]->Height,GL_LUMINANCE,GL_UNSIGNED_BYTE,texture[2]->image);
glutSwapBuffers();
}
void idle(void)
{
glutPostRedisplay();
}
void GrayTexCreate(int NO,char* FileName){
glGenTextures(1, &texName[NO]);
texture[NO] = new TEXTURE(FileName);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
//テクスチャオブジェクトの作成
glBindTexture(GL_TEXTURE_2D, texName[NO]);
glDrawPixels(texture[NO]->Width,texture[NO]->Height,GL_RGBA,GL_UNSIGNED_BYTE,texture[NO]->image);
//1度カラーバッファに書き込む
//グレイスケール変換
glPixelTransferf(GL_RED_SCALE, 0.299f);
glPixelTransferf(GL_GREEN_SCALE, 0.587f);
glPixelTransferf(GL_BLUE_SCALE, 0.114f);
//グレイスケールで読み込む
glReadPixels(0,0,texture[NO]->Width, texture[NO]->Height,
GL_LUMINANCE, GL_UNSIGNED_BYTE, texture[NO]->image);
glPixelTransferf(GL_RED_SCALE, 1.0f);
glPixelTransferf(GL_GREEN_SCALE, 1.0f);
glPixelTransferf(GL_BLUE_SCALE, 1.0f);
}
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);
TexCreate(1,"sample.png");
GrayTexCreate(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;
}
|