固定機能:グレースケール

グレースケールです。
輝度値 = 0.299 * Red + 0.587 * Green + 0.114 * Blue
で変換できます。

ファイル
main.cpp
lodepng.cpp
lodepng.h
PNG.h

sample.png

main.cpp

#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;
}

 

最終更新:2015年01月29日 03:36