高手出招!linux下,利用OpenGL把原始图片(各种格式的如JPG,PNG)加载到程序里面并用OpenGl显示出来,急急急!

xuehlxs 2007-12-11 04:29:35
linux下,利用OpenGL把原始图片(各种格式的如JPG,PNG)加载到程序里面并用OpenGl显示出来,实现方法,最好是代码,急急急!
...全文
319 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
爱情黑白猫 2011-07-26
  • 打赏
  • 举报
回复
你想要的资源在这儿
http://download.csdn.net/source/3462434
牛晨光 2011-07-26
  • 打赏
  • 举报
回复
从我的代码中扣出几个函数,希望对你有帮助。

1、读取png图片

int jnImage::loadFromFile(string filename)
{
clear();

FILE *fp = fopen(filename.c_str(), "rb");
if (NULL == fp)
{
LogFatal(LOG_FILE, "No such File: %s", filename.c_str());
return -1;
}

png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
png_infop info_ptr = png_create_info_struct(png_ptr);
setjmp(png_jmpbuf(png_ptr));
png_init_io(png_ptr, fp);
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_EXPAND, 0);
fclose(fp);

width = png_get_image_width(png_ptr, info_ptr);
height = png_get_image_height(png_ptr, info_ptr);
int color_type = png_get_color_type(png_ptr, info_ptr);

int bys = 0;
switch (color_type)
{
case PNG_COLOR_TYPE_RGB:
alpha = 0;
bys = 3;
break;

case PNG_COLOR_TYPE_RGB_ALPHA:
alpha = 1;
bys = 4;
break;

default:
png_destroy_read_struct(&png_ptr, &info_ptr, 0);
LogFatal(LOG_FILE, "Not support this color type. %s:%d",
filename.c_str(), color_type);
return -2;
}

int size = width * height * bys;
data = (unsigned char*) malloc(size);

png_bytep* row_pointers = png_get_rows(png_ptr, info_ptr);
int pos = 0;
int i,j;
for(i=0; i<height; i++)
{
for(j=0; j<(bys*width); j+=bys)
{
data[pos++] = row_pointers[i][j];
data[pos++] = row_pointers[i][j+1];
data[pos++] = row_pointers[i][j+2];
if (bys == 4)
data[pos++] = row_pointers[i][j+3];
}
}

png_destroy_read_struct(&png_ptr, &info_ptr, 0);

return 0;
}


2、绑定给texture

void jnTexture::addFromFile(string filename)
{
jnImage image;

if (image.loadFromFile(filename) != 0)
return;

glBindTexture(GL_TEXTURE_2D, _array[_count]);

if (image.alpha == 1)
{
_blend = 1;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.width,
image.height, 0, GL_RGBA, GL_UNSIGNED_BYTE,
image.data);
}
else
{
_blend = 0;
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, image.width,
image.height, 0, GL_RGB, GL_UNSIGNED_BYTE,
image.data);

}

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

_count++;
}

3、绘制
[code=C/C++]
void jnRenderable::render(int index)
{
if (_visible == false)
return;

glPushMatrix();
glTranslatef(_position.x, _position.y, 0.0f);
//glRotatef(_rotation, 0, 0, 1);

//glColor4f(sprite->color.r, sprite->color.g, sprite->color.b, sprite->color.a);

_texture->blendBegin();
glEnable(GL_TEXTURE_2D);

GLuint tex = _texture->getTexture(index);
//if (tex == 0)
//{
// LogFatal(LOG_FILE, "tex error ! tex = %d", tex);
// return;
//}

glBindTexture(GL_TEXTURE_2D, tex);

glBegin(GL_QUADS);
{
_texture->render(TEXTURE_LEFT_TOP);
glVertex2i(_size.w/-2, _size.h/2);

_texture->render(TEXTURE_LEFT_BOTTOM);
glVertex2i(_size.w/-2, _size.h/-2);

_texture->render(TEXTURE_RIGHT_BOTTOM);
glVertex2i(_size.w/2, _size.h/-2);

_texture->render(TEXTURE_RIGHT_TOP);
glVertex2i(_size.w/2, _size.h/2);
}
glEnd();

glDisable(GL_TEXTURE_2D);
_texture->blendEnd();

glPopMatrix();
}


[/code]

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧