文章目录
1、简介
1.1 OpenGL简介
OpenGL作为图形界的工业标准,其仅仅定义了一组2D和3D图形接口API,而对于窗口管理、IO消息响应等并没有规定。也就是说,OpenGL依赖各平台提供用于渲染的context以及具体实现方式,而各平台提供的实现不尽相同。这些实现主要有:Windows平台下的WGL、Linux下的Mesa/GLX、Mac OS X下的Cocoa/NSGL,以及跨平台的GLUT、GLFW、SDL等等。
安装OpenGL库:
# sudo apt-get install build-essential libxmu-dev libxi-dev libgl-dev
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
sudo apt-get install libglu1-mesa-dev
使用如下的命令来查看对应显卡的OpenGL版本:
glxinfo | grep -i opengl
1.2 glut简介
https://www.opengl.org/resources/libraries/glut/glut_downloads.php
http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip
https://www.opengl.org/resources/libraries/glut/glut-3.spec.pdf
OpenGL工具库 OpenGL Utility Toolkit,包含大约30多个函数,函数名前缀为glut。
glut是不依赖于窗口平台的OpenGL工具包,由Mark KLilgrad在SGI编写(现在在Nvidia),目的是隐藏不同窗口平台API的复杂度。 函数以glut开头,它们作为aux库功能更强的替代品,提供更为复杂的绘制功能,此函数由glut.dll来负责解释执行。由于glut中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在X-Window, Windows NT, OS/2等系统下运行,特别适合于开发不需要复杂界面的OpenGL示例程序。对于有经验的程序员来说,一般先用glut理顺3D图形代码,然后再集成为完整的应用程序。
1.3 freeglut
https://freeglut.sourceforge.net/
https://github.com/freeglut/freeglut/releases
freeglut最初由帕维尔·W. Olszta与安德烈亚斯·乌姆巴赫和史蒂夫·贝克的贡献。史蒂夫是现在官方的拥有者/维护者。帕维尔在1999年12月1日开始freeglut的开发。目前,该项目几乎可以100%的替代原来的GLUT,只有少数差别(如the abandonment of SGI-specific features,按钮盒子和动态视频分辨率)和 其他一小部分程序Bug。
这个库是原始的GLUT库修改之后得到的,它既提供32位、也提供64位的编译环境。
2、glut安装
2.1 命令安装glut
# sudo apt-get install build-essential freeglut3 freeglut3-dev
# sudo apt-get install libglut-dev or
sudo apt-get install freeglut3-dev
locate freeglut
sudo apt-get remove freeglut3
# or
sudo apt-get -y autoremove freeglut3
# or
sudo apt-get -y purge freeglut3
# or
sudo apt-get -y autoremove --purge freeglut3
在卸载freeglut库之后,编译测试项目如下:
2.2 源码安装glut
- (1)glut
如果安装 GLUT,地址在:https://user.xmission.com/~nate/glut.html,下载 glut-3.7.6-bin.zip(已经十几年没更新过了所以就是这个版本了)
https://user.xmission.com/~nate/glut/glut-3.7.6-bin.zip - (2)freeglut
freeglut 在地址:https://github.com/freeglut/freeglut/releases/download/v3.6.0/freeglut-3.6.0.tar.gz
3、glut测试
3.1 测试1,版本打印
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)
project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
# seach
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
# include
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES})
- main.cpp
#include <iostream>
#include <GL/freeglut.h>
int main(int argc, char** argv)
{
std::cout << "hello, yxy" << std::endl;
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(300, 300);
glutInitWindowPosition(100, 100);
glutCreateWindow("OpenGL Version");
const GLubyte* szVendor = glGetString(GL_VENDOR);
const GLubyte* szRender = glGetString(GL_RENDERER);
const GLubyte* szGLVersion = glGetString(GL_VERSION);
const GLubyte* szGluVersion = gluGetString(GLU_VERSION);
printf("OpenGL实现厂商的名字:%s\n", szVendor);
printf("OpenGL渲染器标识符:%s\n", szRender);
printf("OpenGL实现的版本号:%s\n", szGLVersion);
printf("GLU工具库版本:%s\n", szGluVersion);
return 0;
}
编译如下:
或者直接使用gcc编译
gcc -o test main.c -lGL -lGLU -lglut
# or
apt-get install libglew-dev
g++ -o test main.cpp -lGL -lGLU -lglut -lGLEW
3.2 测试2,绘制三角形
- main.cpp
#include <GL/freeglut.h>
void renderScene(void)
{
glClearColor(1.0, 1.0, 0.6, 1.0);
glClear(GL_COLOR_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_TRIANGLES);
glColor3f(1, 0, 0);
glVertex3f(-0.5, -0.5, 0.0);
glColor3f(0, 1, 0);
glVertex3f(0.5, 0.0, 0.0);
glColor3f(0, 0, 1);
glVertex3f(0.0, 0.5, 0.0);
glEnd();
glutSwapBuffers();
}
int main(int argc, char** argv)
{
glutInit(&argc, (char**)argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
glutInitWindowPosition(100, 100);
glutInitWindowSize(800, 480);
glutCreateWindow("yxy glut: draw triangle");
glutDisplayFunc(renderScene);
glutMainLoop();
return 0;
}
测新项目运行如下:
3.3 测试3,VBO绘制三角形
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)
project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)
# seach
find_package(OpenGL REQUIRED)
find_package(GLUT REQUIRED)
find_package(GLEW REQUIRED)
# include
include_directories(${OPENGL_INCLUDE_DIRS})
include_directories(${GLUT_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} ${OPENGL_LIBRARIES} ${GLUT_LIBRARIES} GLEW::GLEW)
- main.cpp
#include <stdio.h>
#include <GL/glew.h>
#include <GL/freeglut.h>
GLuint VBO;
static void RenderSceneCB()
{
glClear(GL_COLOR_BUFFER_BIT);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableVertexAttribArray(0);
glutSwapBuffers();
}
static void InitializeGlutCallbacks()
{
glutDisplayFunc(RenderSceneCB);
}
static void CreateVertexBuffer()
{
const GLfloat Vertices[] = {
-1.0f, -1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
0.0f, 1.0f, 0.0f
};
glGenBuffers(1, &VBO);
glBindBuffer(GL_ARRAY_BUFFER, VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW);
}
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGBA);
glutInitWindowSize(800, 600);
glutInitWindowPosition(0, 0);
glutCreateWindow("yxy glut: VBO + triangle ");
InitializeGlutCallbacks();
// Must be done after glut is initialized!
GLenum res = glewInit();
if (res != GLEW_OK) {
fprintf(stderr, "Error: '%s'\n", glewGetErrorString(res));
return 1;
}
glClearColor(0.6f, 0.6f, 0.6f, 1.0f);
CreateVertexBuffer();
glutMainLoop();
return 0;
}
测新项目运行如下:
结语
如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;
╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;
o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;
(✿◡‿◡)
感谢各位大佬童鞋们的支持!
( ´ ▽´ )ノ ( ´ ▽´)っ!!!