文章目录

  • 方案一:利用opencv库将图片读取为unsigned char
  • 方案二:利用licvd库将图片读取为unsigned char

My Github Link

方案一:利用opencv库将图片读取为unsigned char

1、用到Opencv将png图片读取到内存,然后转换为GLubyte–unsigned char数据
2、将影像贴图到OpenGL纹理上

#include <stdlib.h>
#include "GL/glut.h"
#include <opencv.hpp>
using namespace cv;
//OpenCV读取图像
Mat I = imread("C://Users//XXX//Desktop//3.png");
//设置长宽
int width = I.cols;
int height = I.rows;
//设置图像指针
GLubyte* pixels;GLuint load_texture()
{//OpenGL纹理用整型数表示GLuint texture_ID;//获取图像指针int pixellength = width * height * 3;pixels = new GLubyte[pixellength];memcpy(pixels, I.data, pixellength * sizeof(char));//imshow("OpenCV", I);//将texture_ID设置为2D纹理信息glGenTextures(2, &texture_ID);glBindTexture(GL_TEXTURE_2D, 1);//纹理放大缩小使用线性插值glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//纹理水平竖直方向外扩使用重复贴图//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_WRAP_S, GL_CLAMP);//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//将图像内存用作纹理信息glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels);free(pixels);return texture_ID;
}void display()
{// 清除屏幕glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//获取纹理对象GLuint image = load_texture();std::cout << image << std::endl;//重新设置OpenGL窗口:原点位置为左上角,x轴从左到右,y轴从上到下,坐标值与像素坐标值相同glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, width, height, 0);//显示纹理glEnable(GL_TEXTURE_2D);    //允许使用纹理glBindTexture(GL_TEXTURE_2D, image);    //选择纹理对象//原始完全填充四边形//glBegin(GL_POLYGON);   //设置为多边形纹理贴图方式并开始贴图//glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);    //纹理左上角对应窗口左上角//glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);    //纹理左下角对应窗口左下角//glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);    //纹理右下角对应窗口右下角//glTexCoord2f(1.0f, 0.0f); glVertex2f(width, 0); //纹理右上角对应窗口右上角//glEnd();    //结束贴图//三角形/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);glEnd();*///多边形glBegin(GL_POLYGON);glTexCoord2f(0.33f, 0.0f); glVertex2f(width/3, 0);glTexCoord2f(0.67f, 0.0f); glVertex2f(width*2/3, 0);glTexCoord2f(1.0f, 0.5f); glVertex2f(width, height/2);glTexCoord2f(0.5f, 1.0f); glVertex2f(width/2, height);glTexCoord2f(0.0f, 0.5f); glVertex2f(0, height/2);glEnd();//任意变换/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(width/4, height/4);glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height*2/3);glTexCoord2f(1.0f, 0.0f); glVertex2f(width*4/5, 50);glEnd();*///边缘贴图效果/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);glTexCoord2f(0.0f, 2.0f); glVertex2f(0, height);glTexCoord2f(2.0f, 2.0f); glVertex2f(width, height);glTexCoord2f(2.0f, 0.0f); glVertex2f(width, 0);glEnd();*/glDisable(GL_TEXTURE_2D);    //禁止使用纹理//双缓存交换缓存以显示图像glutSwapBuffers();
}void main(int argc, char** argv)
{//初始化GLglutInit(&argc, argv);//设置显示参数(双缓存,RGB格式)glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//设置窗口尺寸:width*heightglutInitWindowSize(width, height);//设置窗口位置:在屏幕左上角像素值(100,100)处glutInitWindowPosition(100, 100);//设置窗口名称glutCreateWindow("OpenGL");//显示函数,display事件需要自行编写glutDisplayFunc(display);//重复循环GLUT事件glutMainLoop();
}

方案二:利用licvd库将图片读取为unsigned char

LoadImage函数的功能将是将图片读取为unsigned char,并且将png的width改变为4的倍数

#include <stdlib.h>
#include "GL/glut.h"
//设置长宽
int width = 512;
int height = 256;
//设置图像指针
typedef unsigned char byte;
using namespace std;
#include <cvd/colourmap.h>
#include <cvd/image_io.h>
template<typename TYPE>
static inline void LoadImage(CVD::Image<TYPE>& img1, CVD::Image<TYPE>& img2,const std::string& fileName) {CVD::img_load(img1, fileName);if (img1.size().x % 4 == 0)img2 = img1;else {const int width1 = (img1.size().x + 3) & (~3), height1 = img1.size().y;img2.resize(CVD::ImageRef(width1, height1));img2.zero();for (int y = 0; y < height1; ++y)memcpy(img2[y], img1[y], sizeof(TYPE) * img1.row_stride());}
}GLuint load_texture()
{//OpenGL纹理用整型数表示GLuint texture_ID;//获取图像指针string filename = "C://Users//Yao//Desktop//3.png";CVD::Image<CVD::Rgb<byte> >    m_imgRGB, m_imgRGBTmp;::LoadImage(m_imgRGBTmp, m_imgRGB, filename);cout << (m_imgRGB.size().x) << "," <<( m_imgRGB.size().y) << endl;unsigned char* data = (byte*)m_imgRGB.data();//将texture_ID设置为2D纹理信息glGenTextures(2, &texture_ID);glBindTexture(GL_TEXTURE_2D, texture_ID);//纹理放大缩小使用线性插值glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);//纹理水平竖直方向外扩使用重复贴图//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_WRAP_S, GL_CLAMP);//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);//将图像内存用作纹理信息glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, data);//free(data);return texture_ID;
}void display()
{// 清除屏幕glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//获取纹理对象GLuint image = load_texture();cout << image << endl;//重新设置OpenGL窗口:原点位置为左上角,x轴从左到右,y轴从上到下,坐标值与像素坐标值相同glViewport(0, 0, (GLsizei)width, (GLsizei)height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0, width, height, 0);//显示纹理glEnable(GL_TEXTURE_2D);  //允许使用纹理glBindTexture(GL_TEXTURE_2D, image);    //选择纹理对象//原始完全填充四边形//glBegin(GL_POLYGON);   //设置为多边形纹理贴图方式并开始贴图//glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);    //纹理左上角对应窗口左上角//glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);    //纹理左下角对应窗口左下角//glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);    //纹理右下角对应窗口右下角//glTexCoord2f(1.0f, 0.0f); glVertex2f(width, 0); //纹理右上角对应窗口右上角//glEnd();    //结束贴图//三角形/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height);glEnd();*///多边形glBegin(GL_POLYGON);glTexCoord2f(0.33f, 0.0f); glVertex2f(width/3, 0);glTexCoord2f(0.67f, 0.0f); glVertex2f(width*2/3, 0);glTexCoord2f(1.0f, 0.5f); glVertex2f(width, height/2);glTexCoord2f(0.5f, 1.0f); glVertex2f(width/2, height);glTexCoord2f(0.0f, 0.5f); glVertex2f(0, height/2);glEnd();//任意变换/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(width/4, height/4);glTexCoord2f(0.0f, 1.0f); glVertex2f(0, height);glTexCoord2f(1.0f, 1.0f); glVertex2f(width, height*2/3);glTexCoord2f(1.0f, 0.0f); glVertex2f(width*4/5, 50);glEnd();*///边缘贴图效果/*glBegin(GL_POLYGON);glTexCoord2f(0.0f, 0.0f); glVertex2f(0, 0);glTexCoord2f(0.0f, 2.0f); glVertex2f(0, height);glTexCoord2f(2.0f, 2.0f); glVertex2f(width, height);glTexCoord2f(2.0f, 0.0f); glVertex2f(width, 0);glEnd();*/glDisable(GL_TEXTURE_2D);    //禁止使用纹理//双缓存交换缓存以显示图像glutSwapBuffers();
}void main(int argc, char** argv)
{//初始化GLglutInit(&argc, argv);//设置显示参数(双缓存,RGB格式)glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//设置窗口尺寸:width*heightglutInitWindowSize(width, height);//设置窗口位置:在屏幕左上角像素值(100,100)处glutInitWindowPosition(100, 100);//设置窗口名称glutCreateWindow("OpenGL");//显示函数,display事件需要自行编写glutDisplayFunc(display);//重复循环GLUT事件glutMainLoop();
}

OpenGL纹理贴图相关推荐

  1. C++ Opengl纹理贴图源码

    C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  2. OpenGL 纹理贴图

    纹理贴图允许把一幅砖墙图像映射到一个多边形的表面上,并把正面墙画成单个多边形.纹理贴图能够保证当这个多边形变形或渲染时,映射到多边形表面的图像也能够表现出正确的行为. 纹理贴图是一个相当大的主题,并且 ...

  3. 【OpenGL】二十四、OpenGL 纹理贴图 ( 读取文件内容 | 桌面程序添加控制台窗口 | ‘fopen‘: This function may be unsafe 错误处理 )

    文章目录 一.文件读取 二.报错处理 ( 'fopen': This function or variable may be unsafe. ) 三.桌面程序添加控制台窗口 四.相关资源 一.文件读取 ...

  4. Qt5.6.0+OpenGL 纹理贴图首战告捷

    重要的话写在前面~~通过今晚的实验,知道了EBO是不能随便release的~~~一直不要release就可以了,否则vao会失效 Display.h #ifndef DISPLAYWIDGET_H # ...

  5. C++写纹理贴图中OBJ文件和MTL(材质)文件

    在VTK 或者Opengl纹理贴图中都会用到模型文件,当使用vtkOBJImporter函数读取模型数据时,需要对应的MTL文件才能实现纹理贴图,但是网上大多数的OBJ文件和MTL文件都是由模型软件导 ...

  6. 纹理窗口Qt+OpenGL之纹理贴图

    上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助.今天在这里和大家一起学习一下纹理窗口 NeNe的代码中是加载到了一个正方体当中,代码很长.其实单纯的想要纹理贴图是很便利的.具体的纹理贴图技巧在 ...

  7. OpenGL ES教程VI之纹理贴图(原文对照)

    注:又是一篇,是否有人能解释得清楚,2是重复两次,那么是否N就是重复N次呢?接近1.0的坐标值整数部分加上几就是重复几次吗?这个好像之前验证过不一定的. 转自:http://melord.iteye. ...

  8. OpenGL立方体纹理贴图

    OpenGL正方体纹理贴图 0. 写在最前面 1. 正方体顶点属性构建 2. 绑定多个VAO.VBO 3. 创建多个纹理 4. 渲染循环 5. 实现代码 6. 多个立方体纹理贴图 0. 写在最前面 要 ...

  9. opengl生成图片php,(转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片...

    转:http://blog.csdn.net/junzia/article/details/52842816 前面几篇博客,我们将了Android中利用OpenGL ES 2.0绘制各种形体,并在上一 ...

  10. OpenGL总结6-圆柱纹理贴图

    圆柱纹理贴图我采用了OpenGL中的函数gluCylinder,这个函数会生成空心的圆柱,这个圆柱固定生成为底面位于xy面,z=0,顶面从z=0开始向z轴正方向,也就是说圆柱体是冲着我们生成的,如果想 ...

最新文章

  1. 零基础入门学习Python(35)面向对象编程
  2. 转】Spark DataFrame小试牛刀
  3. C#: 旋转图片到正确位置
  4. asp.net C# 时间格式大全
  5. php5.3无法加载mysql数据库模块_PHP_php5.3不能连接mssql数据库的解决方法,本文实例讲述了php5.3不能连接m - phpStudy...
  6. couchdb java 连接_CouchDB客户端连接的说明---Java版
  7. 电脑键盘上各个键的作用!!!
  8. .NET Compact Framework.代码展开ComboBox下拉选项
  9. 求生之路2正版服务器ip,求生之路2怎么看ip地址
  10. vb mysql 插入记录_vb实现数据库的连接,修改,删除,插入(ADO.Net)
  11. SAP 严重漏洞可导致供应链攻击
  12. 9-16 原生命令和redis-trib.rb对比
  13. iOS 自定义底部tabbar加号按钮实现方法
  14. 2021-09-01175. 组合两个表 SQL
  15. 入门机器学习(西瓜书+南瓜书)神经网络总结(python代码实现)
  16. Java经典小案例(不定时更新)
  17. matlab gui伪色彩增强,基于Matlab GUI的医学灰度图像伪彩色增强判读系统
  18. [计算机组成原理]定点数运算及溢出检测
  19. idea gwt 怎么编译_带Spring Boot的GWT
  20. 链接怎么生成二维码?教你学会制作二维码

热门文章

  1. python opencv 将白色底变成透明底
  2. NPOI 操作word 创建页眉页脚,页眉中插入图片
  3. tplink软件升级有用吗_tplink路由器固件更新的方法
  4. html字体库的是引入----阿里妈妈
  5. 北邮计算机专硕在微软实习转正,【微软中国(Microsoft)实习生面试】很随意很简单,毕竟实习生转正比率很低。-看准网...
  6. windows保护无法启动修复服务器,解决使用sfc命令提示“windows 资源保护无法启动修复服务”的方法...
  7. 苗圩:5G技术将八成用于移动物联网 年内适时发放5G牌照
  8. Win11右键显示更多选项设置教程
  9. 十进制和二进制转换原理
  10. 浅谈搜索引擎优化方法