OpenGL&libcvd使用
- OpenGL
- 参考资料
- 1、OpenGL诸多库之间的关系
- 2、glewInit()
- 3、glEnable()
- 4、glShadeModel()
- 5、glPolygonMode()
- 6、FrameBuffer()
- 7、glutInit(&argc,argv)
- 8、OpenGL与GPU运算
- 9、OpenGL帧缓存对象(FBO:Frame Buffer Object)
- 10、glTexParameteri()理解
- 11、glTexImage2D()
- 12、OpenGL中的glutInitDisplayMode()函数的理解
- 13、纹理映射
- 14、GLSL实现图像处理(FBO方法)
- 15、着色器(Shader):运行在GPU上的程序
- 16、glViewport()、gluOrtho2D()等窗口设置函数
- 17、VBO、VAO、EBO实例代码
- 18、glReadPixels的用法和说明
- libcvd
OpenGL
参考资料
OpenGL实现通用GPU计算概述
OpenGL宏观流程
OpenGL编程管线、渲染管线
知乎OpenGL图形库的使用(三十)
书籍推荐
LearnOpenGL中文版
1、OpenGL诸多库之间的关系
2、glewInit()
对OpenGL进行初始化
3、glEnable()
开启OpenGL的部分功能
glEnable(GL_TEXTURE_RECTANGLE_ARB);参考博客
4、glShadeModel()
GL_FLAT:固定着色,取图元中某个顶点的颜色来填充整个图元。
GL_SMOOTH:会采纳每个顶点的颜色,非顶点的部分根据周边顶点的颜色采取平滑过渡的模式,对于线段图元,线段上各点的颜色会根据两顶点的颜色通过插值得到。
5、glPolygonMode()
https://blog.youkuaiyun.com/qq_40936714/article/details/110161192
6、FrameBuffer()
参考博客
不错的代码
被推荐用于把数据渲染到纹理对像,如数据拷贝或交换缓冲区等,使用FBO技术会更高效并且更容易实现。
创建FBO
创建FBO和产生VBO类似。
glGenFramebuffersEXT()
Void gelGenFramebuffersEXT(GLsizei n,GLuint* ids);
void glDeleteFramebuffersEXT(GLsizei n, const GLuint* ids);
glGenFramebuffersEXT()需要两个参数:第一个是要创建的帧缓存的数目,第二个是指向存储一个或者多个ID的变量或数组的指针。它返回未使用的FBO的ID。ID为0表示默认帧缓存,即window系统提供的帧缓存。
当FBO不再被使用时,FBO可以通过调用glDeleteFrameBuffersEXT()来删除。
glBindFramebufferEXT()
一旦一个FBO被创建,在使用它之前必须绑定。
void glBindFramebufferEXT(GLenum target, GLuint id)
第一个参数target应该是GL_FRAMEBUFFER_EXT,第二个参数是FBO的ID号。一旦FBO被绑定,之后的所有的OpenGL操作都会对当前所绑定的FBO造成影响。ID号为0表示缺省帧缓存,即默认的window提供的帧缓存。因此,在glBindFramebufferEXT()中将ID号设置为0可以解绑定当前FBO。
7、glutInit(&argc,argv)
glut的初始化
8、OpenGL与GPU运算
OpenGL用来做通用GPU计算主要是利用纹理存储器在GPU中计算以及把结果取回内存,这大概是OpenGL做通用GPU计算最好的选择。
参考博客
9、OpenGL帧缓存对象(FBO:Frame Buffer Object)
参考
OpenGL帧缓存对象(FBO:Frame Buffer Object)
10、glTexParameteri()理解
11、glTexImage2D()
定义纹理数据单元类型
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GetInternalFormat<CHANNELS_NUMBER>(), m_width, m_height, 0, GetFormat<CHANNELS_NUMBER>(), GL_FLOAT, NULL);
12、OpenGL中的glutInitDisplayMode()函数的理解
13、纹理映射
14、GLSL实现图像处理(FBO方法)
15、着色器(Shader):运行在GPU上的程序
16、glViewport()、gluOrtho2D()等窗口设置函数
glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluOrtho2D(0, width, height, 0);
17、VBO、VAO、EBO实例代码
18、glReadPixels的用法和说明
libcvd
1、介绍
libCVD是一个非常便携和高性能的C ++库,用于计算机视觉,图像和视频处理。重点是提供简单而有效的图像和视频处理与高品质得实现常见低层图像处理功能。
GitHub链接
CVD0.8版本Tutorial
最新版本Tutorial
简单的例子:
#include <cvd/image_io.h>
using namespace CVD;
int main()
{
Image<byte> in; //Declares an 8 bit greyscale image
in = img_load("test_image.jpg");
img_save(in, "new_image.png");
return 0;
}
2、简单例子
按照GitHub指示在Windows Visual Studio中配置好后,运行如下代码(将影像的列数变为4的倍数,若不是四的倍数,影像右边补全黑色列)
#include <xutility>
#include <io.h>
#include <windows.h>
#include <cvd/colourmap.h>
#include <cvd/image_io.h>
using namespace CVD;
using namespace std;
typedef unsigned char ubyte;
typedef unsigned short ushort;
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 width = (img1.size().x + 3) & (~3), height = img1.size().y;
img2.resize(CVD::ImageRef(width, height));
img2.zero();
for (int y = 0; y < height; ++y)
{
cout << sizeof(TYPE) * img1.row_stride() << endl;
memcpy(img2[y], img1[y], sizeof(TYPE) * img1.row_stride());
}
}
}
int main()
{
CVD::Image<CVD::Rgb<ubyte> >img1;
CVD::Image<CVD::Rgb<ubyte> >img2;
string s =string("C:\\Users\\76760\\Desktop\\test.jpg");
cout << s.c_str() << endl;
std::ifstream i(s.c_str(), std::ios::in | std::ios::binary);
if (!i.good())
cout << "error!" << endl;
::LoadImage(img1, img2, s);
img_save(img1, "img1.png");
img_save(img2, "img2.png");
return 0;
}