アルファテスト

アルファテストです。
アルファテストとはイメージデータのアルファ値を調べて描画するか
しないかを決めるためのものです。
今回は GL_GREATER を指定しているので glAlphaFunc(GL_GREATER, alpha);
の alpha より透明度が大きいピクセルを描画します。
今回のプログラムはしばらくするとアルファ値に応じて画像が切り抜かれていきます。

 

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

test.png

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")

#include <GL/freeglut/freeglut.h>
#include "lodepng.h"

#define WIDTH 320
#define HEIGHT 240

float alpha = 0.0f;
//サイズ用構造体
struct SizeRECT{
 int x;
 int y;
 int width;
 int height;
};

GLuint texture;
//サイズセット
void SetSizeRECT(SizeRECT* rect, int a,int b,int c,int d)
{
 rect->x=a;rect->y=b;rect->width=c;rect->height=d;
}

void Draw()
{
 glEnable(GL_BLEND);
 glEnable( GL_TEXTURE_2D );
 glBindTexture( GL_TEXTURE_2D, texture );
 glAlphaFunc(GL_GREATER, alpha);
 glEnable(GL_ALPHA_TEST);//アルファテスト開始
 glBegin(GL_POLYGON);
 glTexCoord2f(0.0f, 1.0f); glVertex2d(10 , 230);//左下
 glTexCoord2f(0.0f, 0.0f); glVertex2d(10 ,  10);//左上
 glTexCoord2f(1.0f, 0.0f); glVertex2d( 310 ,  10);//右上
 glTexCoord2f(1.0f, 1.0f); glVertex2d( 310 , 230);//右下
 glEnd();
 glDisable(GL_ALPHA_TEST);//アルファテスト終了
 glDisable( GL_TEXTURE_2D );
 glDisable(GL_BLEND);
}
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);

 Draw();

 glutSwapBuffers();
}
void idle(void)
{
 alpha+=0.002f;
 if(alpha>1.0f)alpha=0.0f;
 Sleep(1);
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.5, 0.5, 0.5, 1.0);
 glOrtho(0, WIDTH, HEIGHT, 0, -1, 1);

 LodePNG_Decoder decoder;
 LodePNG_Decoder_init(&decoder);
 unsigned char* buffer;
 unsigned char* image;
 size_t buffersize, imagesize;
 //ロード
 LodePNG_loadFile(&buffer, &buffersize, "test.png");
 //デコード
 LodePNG_decode(&decoder, &image, &imagesize, buffer, buffersize);
 //幅,高さ
 int width = decoder.infoPng.width; int height = decoder.infoPng.height;

 glGenTextures(1, (GLuint *)&texture);
 
 glBindTexture(GL_TEXTURE_2D, texture);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

 glEnable( GL_TEXTURE_2D );
 glBindTexture( GL_TEXTURE_2D, texture );
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0,GL_RGBA, GL_UNSIGNED_BYTE, image);
 glDisable( GL_TEXTURE_2D );

}
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年03月08日 08:10