www.pudn.com > GpuMixImage.rar > MixImage.cpp
#include<stdlib.h>
#include<iostream.h>
#include<GL/glew.h>
#include<GL/glut.h>
#include<Cg/cg.h>
#include<Cg/cgGL.h>
#include<IL/il.h>
#include<UDH/shaderPath.h>
///////////////////////////////////////////////////////////////////////////////////////////////
#pragma comment(lib,"glew32.lib")
#pragma comment(lib,"cg.lib")
#pragma comment(lib,"cgGL.lib")
#pragma comment(lib,"DevIL.lib")
///////////////////////////////////////////////////////////////////////////////////////////////
struct PixelShape{
int SizeX;
int SizeY;
unsigned int ImageProxy;
unsigned char* Buffer;
};
static PixelShape block;
///////////////////////////////////////////////////////////////////////////////////////////////
/////////Cg static variables///////////
static CGcontext context;
static CGprogram vertexProgram;
static CGprogram fragmentProgram;
static CGprofile vertexProfile;
static CGprofile fragmentProfile;
static CGparameter mvp;
static CGparameter Image0;
static CGparameter Image1;
static CGparameter texCoordOffset0;
static CGparameter texCoordOffset1;
static CGparameter MixMode;
static CGparameter MixFactor;
////////////////////////////////////////////////////////////////////////////////////////////////
static GLuint texId0;
static GLuint texId1;
static int mode;
static const float offset0[2]={-0.5 ,0.0};
static const float offset1[2]={-0.5,-0.5};
static const float factor[4]={0.5,0.5,0.5,1.0};
const char* vSrc=SHADER_PATH_VS"ImageMix_v.cg";
const char* fSrc=SHADER_PATH_FS"ImageMix_f.cg";
const char* vEntry="vertexEntry";//vertex shader entry name of main function
const char* fEntry="fragmentEntry";//fragment shader entry name of main function
const char* graph[2]={"C:\\BMP/g0.bmp","C:\\BMP/g1.bmp"};
/////////////////////////////////////////////////////////////////////////////////////////////////
void CgInitor(int _m_mode)
{
context=cgCreateContext();
vertexProfile=cgGLGetLatestProfile(CG_GL_VERTEX);
cgGLSetOptimalOptions(vertexProfile);
vertexProgram=cgCreateProgramFromFile(context,CG_SOURCE,vSrc,vertexProfile,vEntry,NULL);
if(cgIsProgram(vertexProgram)!=CG_TRUE)
{
cout<<"Error:Vertex Program Create Failed"<<endl;
exit(1);
}
cgGLLoadProgram(vertexProgram);
mvp=cgGetNamedParameter(vertexProgram,"mvp");
cgGLSetStateMatrixParameter(mvp,CG_GL_MODELVIEW_PROJECTION_MATRIX,CG_GL_MATRIX_IDENTITY);
texCoordOffset0=cgGetNamedParameter(vertexProgram,"texCoordOffset0");
texCoordOffset1=cgGetNamedParameter(vertexProgram,"texCoordOffset1");
cgSetParameter2fv(texCoordOffset0,offset0);//设置纹理偏移0
cgSetParameter2fv(texCoordOffset1,offset1);//设置纹理偏移1
//
fragmentProfile=cgGLGetLatestProfile(CG_GL_FRAGMENT);
cgGLSetOptimalOptions(fragmentProfile);
fragmentProgram=cgCreateProgramFromFile(context,CG_SOURCE,fSrc,fragmentProfile,fEntry,NULL);
if(cgIsProgram(fragmentProgram)!=CG_TRUE)
{
cout<<"Error:Fragment Program Create Failed"<<endl;
exit(1);
}
cgGLLoadProgram(fragmentProgram);
Image0=cgGetNamedParameter(fragmentProgram,"Image0");
Image1=cgGetNamedParameter(fragmentProgram,"Image1");
MixMode=cgGetNamedParameter(fragmentProgram,"MixMode");
cgSetParameter1i(MixMode,_m_mode);//设置图象混合模式,即插值方法
MixFactor=cgGetNamedParameter(fragmentProgram,"MixFactor");
cgSetParameter4fv(MixFactor,factor);//设置图象混合比例因子
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//这里没什么可说的,就是创建纹理并载入像素数据
void LoadTexture0()
{
glGenTextures(1,&amt;texId0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,texId0);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB,GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_ALPHA,GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV,GL_SRC0_RGB,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_SRC0_ALPHA,GL_TEXTURE);
ilInit();
ilGenImages(1,&amt;block.ImageProxy);
ilBindImage(block.ImageProxy);
ILboolean isLoaded=ilLoadImage(graph[0]);
if(!isLoaded)
{
printf("Error:Image Load Failed.\n");
exit(1);
}
block.SizeX=ilGetInteger(IL_IMAGE_WIDTH);
block.SizeY=ilGetInteger(IL_IMAGE_HEIGHT);
ILboolean isCvt=ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE);
if(!isCvt)
{
printf("Error:Image Convert as Failure.\n");
exit(1);
}
block.Buffer=ilGetData();
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,block.SizeX,block.SizeY,0,GL_RGBA,GL_UNSIGNED_BYTE,block.Buffer);
printf("block.SizeX:>d\nblock.SizeY:>d\nblock.ImageProxy:>d\n",block.SizeX,block.SizeY,block.ImageProxy);
ilDeleteImages(1,&amt;block.ImageProxy);
}
void LoadTexture1()
{
glGenTextures(1,&amt;texId1);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D,texId1);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP_TO_EDGE);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_COMBINE);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_RGB,GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV,GL_COMBINE_ALPHA,GL_INTERPOLATE);
glTexEnvi(GL_TEXTURE_ENV,GL_SRC0_RGB,GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV,GL_SRC0_ALPHA,GL_TEXTURE);
ilInit();
ilGenImages(1,&amt;block.ImageProxy);
ilBindImage(block.ImageProxy);
ILboolean isLoaded=ilLoadImage(graph[1]);
if(!isLoaded)
{
printf("Error:Image Load Failed.\n");
exit(1);
}
block.SizeX=ilGetInteger(IL_IMAGE_WIDTH);
block.SizeY=ilGetInteger(IL_IMAGE_HEIGHT);
ILboolean isCvt=ilConvertImage(IL_RGBA,IL_UNSIGNED_BYTE);
if(!isCvt)
{
printf("Error:Image Convert as Failure.\n");
exit(1);
}
block.Buffer=ilGetData();
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,block.SizeX,block.SizeY,0,GL_RGBA,GL_UNSIGNED_BYTE,block.Buffer);
printf("block.SizeX:>d\nblock.SizeY:>d\nblock.ImageProxy:>d\n",block.SizeX,block.SizeY,block.ImageProxy);
ilDeleteImages(1,&amt;block.ImageProxy);
}
/////////////////////////////////////////////////////////////////////////////////////////////////
void entry(int mode)
{
switch(mode)
{
case 0:
mode=0;//将图象混合模式设置为线性插值:(1-f)*Image0+f*Image1
break;
case 1:
mode=1;//将图象混合模式设置为2次插值:(1-f*f)*Image0+f*f*Image2
break;
case 2:
mode=2;//将图象混合模式设置为厄米插值(hermite interpolate);
//t=clamp((v-min)/(max-min),0.0,1.0);
//result=-2.0*t*t*t+3.0*t*t
break;
case 3:
mode=3;//将图象混合模式设置为clamp插值
//对于clamp(f,min,max)
//当f小于min时返回min
//当f大于max时返回max
//当min<=f<=max时返回f
break;
default:
mode=0;
}
CgInitor(mode);
glutPostRedisplay();
}
////////////////////////////////////////////////////////////////////////////////////////////////
void InitRenderContext()
{
glClearColor(1.0,1.0,1.0,1.0);
glShadeModel(GL_SMOOTH);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
cgGLBindProgram(vertexProgram);
cgGLEnableProfile(vertexProfile);
cgGLBindProgram(fragmentProgram);
cgGLEnableProfile(fragmentProfile);
cgGLSetTextureParameter(Image0,texId0);
cgGLEnableTextureParameter(Image0);
cgGLSetTextureParameter(Image1,texId1);
cgGLEnableTextureParameter(Image1);
glBegin(GL_QUADS);
glMultiTexCoord2i(GL_TEXTURE0,0,0);
glMultiTexCoord2i(GL_TEXTURE1,0,0);
glVertex2i(0,0);
glMultiTexCoord2i(GL_TEXTURE0,0,255);
glMultiTexCoord2i(GL_TEXTURE1,0,255);
glVertex2i(0,254);
glMultiTexCoord2i(GL_TEXTURE0,255,255);
glMultiTexCoord2i(GL_TEXTURE1,255,255);
glVertex2i(254,254);
glMultiTexCoord2i(GL_TEXTURE0,255,0);
glMultiTexCoord2i(GL_TEXTURE1,255,0);
glVertex2i(254,0);
glEnd();
cgGLDisableTextureParameter(Image1);
cgGLDisableTextureParameter(Image0);
cgGLDisableProfile(fragmentProfile);
cgGLDisableProfile(vertexProfile);
glutSwapBuffers();
}
//////////////////////////////////////////////////////////////////////////////////////////
void Reshape(int x,int y)
{
glViewport(0,0,x,y);
glMatrixMode(GL_PROJECTION);
glFrustum(.0,.6,.0,.6,4.0,20.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef( 0.0, 0.0, -12.0 );
}
//////////////////////////////////////////////////////////////////////////////////////////
int main(int argc,char** args)
{
glutInit(&amt;argc,args);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowPosition(0,0);
glutInitWindowSize(256,256);
glutCreateWindow("Cg Shader for Image Interpolation");
GLenum err;
if((err=glewInit())!=GLEW_OK)
{
printf("Error:GLEW Initialize Failed\n");
exit(1);
}
LoadTexture0();
LoadTexture1();
CgInitor(0);
glutReshapeFunc(Reshape);
InitRenderContext();
glutDisplayFunc(display);
glutCreateMenu(entry);
glutAddMenuEntry("Linear",0);
glutAddMenuEntry("Quadric",1);
glutAddMenuEntry("Hermite",2);
glutAddMenuEntry("Clamp",3);
glutAttachMenu(GLUT_RIGHT_BUTTON);
glutMainLoop();
cgDestroyContext(context);
glDeleteTextures(1,&amt;texId0);
glDeleteTextures(1,&amt;texId1);
return 0;
}