opengl中没有像dx那种加载图片的函数,使用devil将很好的实现这个功能。opengl中的辅助库aux中有这些功能。但不利于移植,所以不建议使用,但对于学习来说还是比较方便的。
以下转载 核动力机器人的博客http://blog.csdn.net/ccsdu2004/archive/2009/04/05/4050214.aspx
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <GL/gl.h>
#include <stdio.h>
#include <math.h>
#include <IL/ilut.h>
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
using namespace std;
struct STextureData
{
unsigned int nWidth;
unsigned int nHeight;
unsigned char* pData;
};
STextureData m_TextData;
GLuint m_glId;
void Bind()
{
if(!m_glId)
{
glGenTextures(1,&m_glId);
glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
glBindTexture(GL_TEXTURE_2D,m_glId);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
gluBuild2DMipmaps(GL_TEXTURE_2D,
4,
m_TextData.nWidth,
m_TextData.nHeight,
GL_RGB,
GL_UNSIGNED_BYTE,
m_TextData.pData);
glTexImage2D(GL_TEXTURE_2D, 0, 4, m_TextData.nWidth, m_TextData.nHeight,
0,GL_RGBA,GL_UNSIGNED_BYTE,m_TextData.pData);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}
glBindTexture(GL_TEXTURE_2D,m_glId);
}
void CreateMipmaps()
{
glGenTextures(1,&m_glId);
glBindTexture(GL_TEXTURE_2D,m_glId);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
void SetColorKey(unsigned char Red,unsigned char Green,unsigned char Blue)
{
if (m_glId)
{
glDeleteTextures(1,&m_glId);
m_glId = 0;
}
unsigned long Count = m_TextData.nWidth * m_TextData.nHeight * 4;
for (unsigned long i = 0; i<Count; i+=4)
{
if ( (m_TextData.pData[i]==Red) && (m_TextData.pData[i+1]==Green)
&& (m_TextData.pData[i+2]==Blue) )
m_TextData.pData[i+3] = 0;
else
m_TextData.pData[i+3] = 255;
}
}
void display(void)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glColor3f(0.0, 1.0, 1.0);
Bind();
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2f(-1,-1);
glTexCoord2i(0, 1); glVertex2f(-1,1);
glTexCoord2i(1, 1); glVertex2f(1,1);
glTexCoord2i(1, 0); glVertex2f(1,-1);
glEnd();
glFlush();
}
void init(void)
{
ILuint picId;
ilGenImages(1,&picId);
ilBindImage(picId);
string filename = "1.bmp";
ilLoadImage(filename.c_str());
m_TextData.nWidth = ilGetInteger(IL_IMAGE_WIDTH);
m_TextData.nHeight = ilGetInteger(IL_IMAGE_HEIGHT);
cout<<" "<<m_TextData.nWidth<<" "<<m_TextData.nHeight<<endl;
unsigned int size = m_TextData.nWidth * m_TextData.nHeight * 4;
m_TextData.pData = new unsigned char[size];
ilCopyPixels(0, 0, 0, m_TextData.nWidth, m_TextData.nHeight,
1, IL_RGBA, IL_UNSIGNED_BYTE, m_TextData.pData);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glShadeModel (GL_FLAT);
}
int main(int argc, char** argv)
{
ilInit();
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}