色の反転

色を反転させます。

ファイル
main.cpp
lodepng.cpp
lodepng.h
PNG.h
GLSL.h
vertex.shader
flagment.shader

sample.png

vertex.shader

varying vec2 pos;

void main(void)
{
    pos = gl_Vertex.xy;
    gl_Position = ftransform();
}

flagment.shader

uniform sampler2D image;
uniform int img_Width, img_Height;
varying vec2 pos;

void main(void)
{
    vec2 texCoord = vec2(pos.x / float(img_Width), pos.y / float(img_Height));
    vec4 col = texture2D(image, texCoord);
    gl_FragColor.rgb = vec3(1.0) - col.rgb;
}

main.cpp

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

 

 

 

 

 

 

最終更新:2015年02月01日 21:24