为c++配置opengl编程环境
下载GLFW源码
官网:https://www.glfw.org/download.html
点击Source package按钮下载源码。
下载GLAD源码
- 语言(Language)选择“C/C++”。
- API的gl选项中,选择“Version 3.3”。
- 模式(Profile)选择“Core”。
- 勾选生成加载器(Generate a loader)。
点击生成(Generate)按钮生成。
在生成后提供的新页面中点击glad.zip下载。
测试环境
目录结构:
.
|____CMakeLists.txt
|____third_party
| |____glad
| |____glfw
|____build
|____main.cpp
CMake项目配置:
cmake_minimum_required(VERSION 3.10)
project(Main)
set(CMAKE_CXX_STANDARD 14)
# 1. 添加GLAD的头文件路径
include_directories(third_party/glad/include)
# 2. 添加GLFW作为子项目并构建
set(GLFW_BUILD_DOCS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_TESTS OFF CACHE BOOL "" FORCE)
set(GLFW_BUILD_EXAMPLES OFF CACHE BOOL "" FORCE)
add_subdirectory(third_party/glfw)
# 3. 将GLAD的源文件(glad.c)添加到可执行文件的构建中
add_executable(${PROJECT_NAME} main.cpp third_party/glad/src/glad.c)
# 4. 链接GLFW库
target_link_libraries(${PROJECT_NAME} glfw)
# 5. 根据不同平台链接相应的库和框架
if(APPLE)
# macOS平台:链接必要的框架
target_link_libraries(${PROJECT_NAME} "-framework OpenGL")
target_link_libraries(${PROJECT_NAME} "-framework Cocoa")
target_link_libraries(${PROJECT_NAME} "-framework IOKit")
target_link_libraries(${PROJECT_NAME} "-framework CoreVideo")
# macOS平台静态链接选项(注意:macOS系统框架通常不支持完全静态链接)
# target_link_options(${PROJECT_NAME} PRIVATE -static-libgcc -static-libstdc++)
elseif(WIN32)
# Windows平台:链接OpenGL库
target_link_libraries(${PROJECT_NAME} opengl32)
# Windows可能还需要链接其他必要的系统库
target_link_libraries(${PROJECT_NAME} gdi32 user32 shell32)
# 添加静态链接选项
target_link_options(${PROJECT_NAME} PRIVATE -static)
else()
# Linux或其他平台
find_package(OpenGL REQUIRED)
target_link_libraries(${PROJECT_NAME} OpenGL::GL)
# Linux平台静态链接选项(注意:某些Linux系统库可能不支持完全静态链接)
#target_link_options(${PROJECT_NAME} PRIVATE -static-libgcc -static-libstdc++)
endif()
测试代码:
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <stdio.h>
void framebuffer_size_callback(GLFWwindow* window,int width,int height){
glViewport(0,0,width,height);
}
void processInput(GLFWwindow *window){
if(glfwGetKey(window,GLFW_KEY_ESCAPE) == GLFW_PRESS){
glfwSetWindowShouldClose(window,true);
}
}
const char *vertexShaderSource =
"#version 330 core\n"
"layout (location = 0) in vec3 aPos;\n"
"void main(){\n"
" gl_Position = vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
"}\0";
const char *fragmentShaderSource =
"#version 330 core\n"
"out vec4 FragColor;\n"
"void main(){\n"
" FragColor = vec4(1.0f,0.5f,0.2f,1.0f);\n"
"}\0";
float vertices[] = {
-0.5f,-0.5f,0.0f,
0.5f,-0.5f,0.0f,
0.0f,0.5f,0.0f
};
int main(){
glfwInit();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR,3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR,3);
glfwWindowHint(GLFW_OPENGL_PROFILE,GLFW_OPENGL_CORE_PROFILE);
#ifdef __APPLE__
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT,GL_TRUE);
#endif
GLFWwindow* window = glfwCreateWindow(800,600,"hello",NULL,NULL);
if(window == NULL){
printf("无法创建GLFW窗口\n");
glfwTerminate();
return -1;
}
glfwMakeContextCurrent(window);
glfwSetFramebufferSizeCallback(window,framebuffer_size_callback);
if(!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){
printf("GLAD失败\n");
return -1;
}
unsigned int vertexShader;
vertexShader = glCreateShader(GL_VERTEX_SHADER);
glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
glCompileShader(vertexShader);
unsigned int fragmentShader;
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
glCompileShader(fragmentShader);
unsigned int shaderProgram;
shaderProgram = glCreateProgram();
glAttachShader(shaderProgram,vertexShader);
glAttachShader(shaderProgram,fragmentShader);
glLinkProgram(shaderProgram);
glDeleteShader(vertexShader);
glDeleteShader(fragmentShader);
unsigned int VBO,VAO;
glGenVertexArrays(1,&VAO);
glGenBuffers(1,&VBO);
glBindVertexArray(VAO);
glBindBuffer(GL_ARRAY_BUFFER,VBO);
glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3 * sizeof(float),(void*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
while(!glfwWindowShouldClose(window)){
processInput(window);
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shaderProgram);
glBindVertexArray(VAO);
glDrawArrays(GL_TRIANGLES,0,3);
glfwSwapBuffers(window);
glfwPollEvents();
}
glDeleteVertexArrays(1,&VAO);
glDeleteBuffers(1,&VBO);
glDeleteProgram(shaderProgram);
glfwTerminate();
return 0;
}
编译并运行代码
在终端,移动到build文件夹中,运行如下命令:
cmake ..
Windows系统的指令需要改进成这样:
cmake -G "MinGW Makefiles" ..
运行之后会创建Makefile文件。
然后运行如下命令:
make
Windows系统如果提示没有make指令,就运行这个:
mingw32-make
在build文件夹中,可以看到Main可执行文件,点击运行后如果出现如下窗口,则环境配置成功:



Top comments (0)