从本地加载纹理【基于SOIL库】

举报
ShaderJoy 发表于 2021/12/30 00:46:11 2021/12/30
【摘要】 本文参考自:http://blog.csdn.net/dreamcs/article/details/7696069 不过他是利用GLUT和GLAUX库加载的位图,我是基于SOIL(Simple OpenGL Image Library)库。 SOIL库除了可以直接将 2D/3D 图像加载成OpenGL纹理以外,还可以返回图像...

本文参考自:http://blog.csdn.net/dreamcs/article/details/7696069

不过他是利用GLUT和GLAUX库加载的位图,我是基于SOIL(Simple OpenGL Image Library)库。


SOIL库除了可以直接将 2D/3D 图像加载成OpenGL纹理以外,还可以返回图像的字节数据——SOIL_load_image 并将其保存为其他格式图片——SOIL_save_image(但要注意主动释放——SOIL_free_image_data),还能够截取屏幕——SOIL_save_screenshot。


关于SOIL库的资料可以移步 http://lonesock.net/soil.html(网站只提供基于VC工程的源码,需要自己简单编译一下)


废话不多说,代码如下:



      void init(void)
      {
         glClearColor(0.0, 0.0, 0.0, 0.0);
         glShadeModel(GL_FLAT);
         glEnable(GL_DEPTH_TEST);
     	// ------------------------------------
          texName = SOIL_load_OGL_texture
                    (
                       "../micky.png",
                        SOIL_LOAD_AUTO,
                        SOIL_CREATE_NEW_ID,
                        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
                    );
         /* check for an error during the load process */
         if (0 == texName)
          {
             printf("SOIL loading error: '%s'\n", SOIL_last_result());
          }
     	// 按字节对齐
         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
         // 区别1
         //glGenTextures(1, &texName);
         glBindTexture(GL_TEXTURE_2D, texName);
         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);
         // 区别2
         //glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, imageRec->sizeX, imageRec->sizeX,
         // 0, GL_RGB, GL_UNSIGNED_BYTE, imageRec->data);
      }
      void display(void)
      {
         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
         glEnable(GL_TEXTURE_2D);
         glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
         glBindTexture(GL_TEXTURE_2D, texName);
         glBegin(GL_QUADS);
     	// 左面
         glTexCoord2f(0.0, 0.0);
         glVertex3f(-2.0, -1.0, 0.0);
         glTexCoord2f(0.0, 1.0);
         glVertex3f(-2.0, 1.0, 0.0);
         glTexCoord2f(1.0, 1.0);
         glVertex3f(0.0, 1.0, 0.0);
         glTexCoord2f(1.0, 0.0);
         glVertex3f(0.0, -1.0, 0.0);
     	// 右面
         glTexCoord2f(0.0, 0.0);
         glVertex3f(1.0, -1.0, 0.0);
         glTexCoord2f(0.0, 1.0);
         glVertex3f(1.0, 1.0, 0.0);
         glTexCoord2f(1.0, 1.0);
         glVertex3f(2.41421, 1.0, -1.41421);
         glTexCoord2f(1.0, 0.0);
         glVertex3f(2.41421, -1.0, -1.41421);
         glEnd();
         glFlush();	// 与单缓冲对应
         // glDisable(GL_TEXTURE_2D);
         glBindTexture(GL_TEXTURE_2D, 0);
      }
      void reshape(int w, int h)
      {
         glViewport(0, 0, (GLsizei)w, (GLsizei)h);
         glMatrixMode(GL_PROJECTION);
         glLoadIdentity();
         gluPerspective(60.0, (GLfloat)w / (GLfloat)h, 1.0, 30.0);	// ☆
         glMatrixMode(GL_MODELVIEW);
         glLoadIdentity();
         glTranslatef(0.0, 0.0, -3.6);
      }
      int main(int argc, char **argv)
      {
         glutInit(&argc, argv);
         // 单缓冲
         glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
         glutInitWindowSize(640, 640);
         glutInitWindowPosition(100, 100);
         glutCreateWindow(argv[0]);
         init();
         glutDisplayFunc(display);
         glutReshapeFunc(reshape);
         glutMainLoop();
         return 0;
      }
  
 

(比如创建OpenGL 上下文 和 初始化GLEW扩展)


效果图所示:




文章来源: panda1234lee.blog.csdn.net,作者:panda1234lee,版权归原作者所有,如需转载,请联系作者。

原文链接:panda1234lee.blog.csdn.net/article/details/53009017

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。