DEV Community

Stukdee_Gorye
Stukdee_Gorye

Posted on

为c++配置opengl编程环境

为c++配置opengl编程环境

下载GLFW源码

官网:https://www.glfw.org/download.html

点击Source package按钮下载源码。

下载GLAD源码

下载地址:https://glad.dav1d.de/

  • 语言(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
Enter fullscreen mode Exit fullscreen mode

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()


Enter fullscreen mode Exit fullscreen mode

测试代码:

#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;
}
Enter fullscreen mode Exit fullscreen mode

编译并运行代码

在终端,移动到build文件夹中,运行如下命令:

cmake ..
Enter fullscreen mode Exit fullscreen mode

Windows系统的指令需要改进成这样:

cmake -G "MinGW Makefiles" ..
Enter fullscreen mode Exit fullscreen mode

运行之后会创建Makefile文件。

然后运行如下命令:

make
Enter fullscreen mode Exit fullscreen mode

Windows系统如果提示没有make指令,就运行这个:

mingw32-make
Enter fullscreen mode Exit fullscreen mode

在build文件夹中,可以看到Main可执行文件,点击运行后如果出现如下窗口,则环境配置成功:

Top comments (0)