バイリニアフィルタリング

バイリニアフィルタリングです。
glTexParameteri に GL_LINEAR を設定するだけで使用できます。

 

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

maptip.png

main.cpp

#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <GL/freeglut/freeglut.h>
#include <stdio.h>
#include <string>
#include "lodepng.h"
using namespace std;

#define WIDTH 320
#define HEIGHT 240

GLuint Tex[2];

void Draw(float x,float y,float w,float h)
{
    glEnable(GL_ALPHA_TEST);//アルファテスト開始
    glBegin(GL_POLYGON);
  glTexCoord2f(0.f, 0.f); glVertex2f(x,y);
  glTexCoord2f(0.2f, 0.f); glVertex2f(x+w,y);
  glTexCoord2f(0.2f, 0.2f); glVertex2f(x+w,y+h);
  glTexCoord2f(0.f, 0.2f); glVertex2f(x,y+h);
    glEnd();
    glDisable(GL_ALPHA_TEST);//アルファテスト終了
}
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);

 glEnable( GL_TEXTURE_2D );
 glBindTexture( GL_TEXTURE_2D, Tex[0] );
 //元画像
 Draw(10,10,128,128);
 glBindTexture( GL_TEXTURE_2D, Tex[1] );
 //バイリニアフィルタリング
 Draw(160,10,128,128);

 glDisable( GL_TEXTURE_2D );

 glutSwapBuffers();
}
void idle(void)
{
 glutPostRedisplay();
}
void Init(){
 glClearColor(0.0, 0.0, 0.0, 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, "maptip.png");
 //デコード
 LodePNG_decode(&decoder, &image, &imagesize, buffer, buffersize);
 //幅,高さ
 int width = decoder.infoPng.width; int height = decoder.infoPng.height;

 glGenTextures(2, (GLuint *)&Tex);
 
 glEnable( GL_TEXTURE_2D );
 glBindTexture(GL_TEXTURE_2D, Tex[0]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);

 glBindTexture( GL_TEXTURE_2D, Tex[0] );
 glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,width, height, 0,GL_RGBA, GL_UNSIGNED_BYTE, image);

 glBindTexture(GL_TEXTURE_2D, Tex[1]);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

 glBindTexture( GL_TEXTURE_2D, Tex[1] );
 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年01月25日 21:20