wordpress 搜索模版寧波seo優(yōu)化公司排名
文章目錄
- 1、簡介
- 1.1 OpenGL簡介
- 1.2 glfw簡介
- 2、安裝glfw
- 2.1 直接命令二進制安裝
- 2.2 源碼安裝
- 3、測試glfw
- 3.1 測試1,glfw+glew
- 3.2 測試2,glfw+glad
- 3.3 測試3
- 結(jié)語
1、簡介
1.1 OpenGL簡介
OpenGL作為圖形界的工業(yè)標(biāo)準(zhǔn),其僅僅定義了一組2D和3D圖形接口API,而對于窗口管理、IO消息響應(yīng)等并沒有規(guī)定。也就是說,OpenGL依賴各平臺提供用于渲染的context以及具體實現(xiàn)方式,而各平臺提供的實現(xiàn)不盡相同。這些實現(xiàn)主要有:Windows平臺下的WGL、Linux下的Mesa/GLX、Mac OS X下的Cocoa/NSGL,以及跨平臺的GLUT、GLFW、SDL等等。
安裝OpenGL庫:
sudo apt-get install build-essential
sudo apt-get install libgl1-mesa-dev
使用如下的命令來查看對應(yīng)顯卡的OpenGL版本:
glxinfo | grep -i opengl
1.2 glfw簡介
GLFW 是一個開源的多平臺庫,適用于 OpenGL、OpenGL ES 和 桌面上的 Vulkan 開發(fā)。它提供了一個簡單的 API 來創(chuàng)建 窗口、上下文和表面,接收輸入和事件。
GLFW 是用 C 語言編寫的,支持 Windows、macOS、Wayland 和 X11。
GLFW 根據(jù) zlib/libpng 許可證獲得許可。
https://www.glfw.org/
查看glfw安裝情況如下:
locate glfw
2、安裝glfw
2.1 直接命令二進制安裝
使用包管理器安裝。
- 安裝glfw:
sudo apt-get update
sudo apt-get -y install libglfw3# 或者
sudo apt-get install libglfw3
sudo apt-get install libglfw3-dev# 或者
sudo apt update
sudo apt -y install libglfw3
- 卸載glfw
# 要僅卸載包libglfw3
sudo apt-get remove libglfw3# 卸載 libglfw3 及其依賴項
sudo apt-get -y autoremove libglfw3# 刪除 libglfw3 配置和數(shù)據(jù)
sudo apt-get -y purge libglfw3
2.2 源碼安裝
官方地址:
https://github.com/glfw/glfw
從 GLFW 的官方網(wǎng)站下載源代碼并編譯安裝,依次執(zhí)行如下命令:
# git clone git@github.com:glfw/glfw.git
# wget https://github.com/glfw/glfw/archive/refs/tags/3.4.tar.gz
wget http://github.com/glfw/glfw/releases/download/3.4/glfw-3.4.zip
cd glfw-3.4
mkdir build && cd build
sudo apt-get install libxrandr-dev
sudo apt-get install libxinerama-dev
sudo apt-get install libxcursor-dev
sudo apt-get install libxi-dev
cmake .. -DGLFW_BUILD_WAYLAND:BOOL=OFF
make -j4
sudo make install
通過wget下載glfw源碼。
通過cmake編譯glfw代碼。
通過make install安裝glfw庫文件。
3、測試glfw
3.1 測試1,glfw+glew
要在 Linux 系統(tǒng)上配置 OpenGL 開發(fā)環(huán)境并使用 GLFW 和 GLEW,你可以按照以下步驟操作。
使用 GLEW 加載所有 OpenGL 函數(shù)指針。通過cmake構(gòu)建測試工程。
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)project(my_project)find_package(OpenGL REQUIRED)
find_package(GLEW REQUIRED)
find_package(glfw3 REQUIRED)add_executable(main main.cpp)
target_link_libraries(main OpenGL::GL GLEW::GLEW glfw)
- main.cpp
#include <GL/glew.h>
#include <GLFW/glfw3.h>int main(void)
{GLFWwindow* window;/* Initialize the library */if (!glfwInit())return -1;/* Create a windowed mode window and its OpenGL context */window = glfwCreateWindow(640, 480, "Hello World, yxy", NULL, NULL);if (!window){glfwTerminate();return -1;}/* Make the window's context current */glfwMakeContextCurrent(window);if(glewInit() != GLEW_OK){std::cerr << "Failed to initalize GLEW" << std::endl;return -1;}/* Loop until the user closes the window */while (!glfwWindowShouldClose(window)){/* Render here */glClear(GL_COLOR_BUFFER_BIT);glClearColor(0, 1, 0, 1);/* Swap front and back buffers */glfwSwapBuffers(window);/* Poll for and process events */glfwPollEvents();}glfwTerminate();return 0;
}
編譯如下:
3.2 測試2,glfw+glad
GLAD 是一個用于加載 OpenGL 函數(shù)指針的庫,它簡化了 OpenGL 函數(shù)的調(diào)用。你可以從 GLAD 的官方網(wǎng)站下載并生成適合你需求的 GLAD 配置。通常,你需要指定 OpenGL 的版本和配置文件類型(通常是核心模式)。生成后,將包含的頭文件和源文件添加到你的項目中。
在你的項目中,你需要包含 GLAD 和 GLFW 的頭文件,并鏈接到相應(yīng)的庫。如果你使用 CMake,你可能需要在你的 CMakeLists.txt 文件中添加相應(yīng)的鏈接指令。
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)find_package(glfw3 REQUIRED)file(GLOB SOURCE_FILES glad.c main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})target_link_libraries(${PROJECT_NAME} glfw)
- main.cpp
#include <iostream>
#include <glad/glad.h>
#include <GLFW/glfw3.h>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);int main() {// Intialize GLFWglfwInit();// Configure GLFW (v3.3)glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);// Create a window objectGLFWwindow* window = glfwCreateWindow(800, 600, "LearnOpenGL, yxy", NULL, NULL);if (window == NULL) {std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}// Make our window the main context on the current threadglfwMakeContextCurrent(window);// Initialize GLADif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)) {std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// Set size of the rendering window (dimensions)glViewport(0, 0, 800, 600);// Register a callback function on the window that gets called// each time the window is resizedglfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// Render loop that keeps on running until we tell GLFW to stopwhile(!glfwWindowShouldClose(window)) {// Check input close window if it is the escape keyprocessInput(window);// Rendering commands here// Set a color to clear the screen with (state-setting function)glClearColor(0.2f, 0.3f, 0.3f, 1.0f);// Clear the screen with the color (state-using function)glClear(GL_COLOR_BUFFER_BIT);// Swap the color buffer and show output to the screenglfwSwapBuffers(window);// Check if any events are triggeredglfwPollEvents();}// Clean/delete all GLFW's resourcesglfwTerminate();return 0;
}void framebuffer_size_callback(GLFWwindow* window, int width, int height) {// Update width and heightglViewport(0, 0, width, height);
}void processInput(GLFWwindow *window) {// Check whether the user has pressed the escape key and close GLFWif (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}
編譯如下:
3.3 測試3
- CMakeLists.txt
cmake_minimum_required(VERSION 2.8.1)project(my_project)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 14)find_package(glfw3 REQUIRED)file(GLOB SOURCE_FILES glad.c main.cpp)
add_executable(${PROJECT_NAME} ${SOURCE_FILES})target_link_libraries(${PROJECT_NAME} glfw)
- main.cpp
#include <glad/glad.h>
#include <GLFW/glfw3.h>#include <iostream>void framebuffer_size_callback(GLFWwindow* window, int width, int height);
void processInput(GLFWwindow *window);
const unsigned int SCR_WIDTH = 800;
const unsigned int SCR_HEIGHT = 600;// 頂點著色器,GLSL語言
const char *vertexShaderSource = "#version 330 core\n""layout (location = 0) in vec3 aPos;\n""void main()\n""{\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""{\n"" FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n""}\n\0";int main()
{// glfw: initialize and configureglfwInit();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// glfw window creationGLFWwindow* window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "LearnOpenGL, yxy", NULL, NULL);if (window == NULL){std::cout << "Failed to create GLFW window" << std::endl;glfwTerminate();return -1;}glfwMakeContextCurrent(window);glfwSetFramebufferSizeCallback(window, framebuffer_size_callback);// glad: load all OpenGL function pointersif (!gladLoadGLLoader((GLADloadproc)glfwGetProcAddress)){std::cout << "Failed to initialize GLAD" << std::endl;return -1;}// build and compile our shader program// ------------------------------------// vertex shaderint vertexShader = glCreateShader(GL_VERTEX_SHADER);glShaderSource(vertexShader, 1, &vertexShaderSource, NULL);glCompileShader(vertexShader);// check for shader compile errorsint success;char infoLog[512];glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;}// fragment shaderint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL);glCompileShader(fragmentShader);// check for shader compile errorsglGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);if (!success){glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog);std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;}// link shadersint shaderProgram = glCreateProgram();glAttachShader(shaderProgram, vertexShader);glAttachShader(shaderProgram, fragmentShader);glLinkProgram(shaderProgram);// check for linking errorsglGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;}glDeleteShader(vertexShader);glDeleteShader(fragmentShader);float vertices[] = {-0.5f, -0.5f, 0.0f, // left0.5f, -0.5f, 0.0f, // right0.0f, 0.5f, 0.0f // top};unsigned int VBO, VAO;//創(chuàng)建VAO對象glGenVertexArrays(1, &VAO);glBindVertexArray(VAO);//創(chuàng)建VBO對象,把頂點數(shù)組復(fù)制到一個頂點緩沖中,供OpenGL使用glGenBuffers(1, &VBO);glBindBuffer(GL_ARRAY_BUFFER, VBO); // 緩沖綁定到GL_ARRAY_BUFFERglBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 頂點數(shù)據(jù)復(fù)制到緩沖的內(nèi)存中//解釋頂點數(shù)據(jù)方式glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); // 頂點數(shù)據(jù)的解釋glEnableVertexAttribArray(0);// 解綁VAOglBindVertexArray(0);// 解綁VBOglBindBuffer(GL_ARRAY_BUFFER, 0);// render loop// -----------while (!glfwWindowShouldClose(window)){// input// -----processInput(window);// render// ------glClearColor(0.2f, 0.3f, 0.3f, 1.0f);glClear(GL_COLOR_BUFFER_BIT);// draw our first triangleglUseProgram(shaderProgram);glBindVertexArray(VAO);glDrawArrays(GL_TRIANGLES, 0, 3);glfwSwapBuffers(window);glfwPollEvents();}// optional: de-allocate all resourcesglDeleteVertexArrays(1, &VAO);glDeleteBuffers(1, &VBO);glDeleteProgram(shaderProgram);glfwTerminate();return 0;
}//鍵盤按鍵回調(diào)函數(shù)
void processInput(GLFWwindow *window)
{if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)glfwSetWindowShouldClose(window, true);
}//調(diào)整窗口大小回調(diào)函數(shù)
void framebuffer_size_callback(GLFWwindow* window, int width, int height)
{glViewport(0, 0, width, height);
}
結(jié)語
如果您覺得該方法或代碼有一點點用處,可以給作者點個贊,或打賞杯咖啡;
╮( ̄▽ ̄)╭
如果您感覺方法或代碼不咋地//(ㄒoㄒ)//,就在評論處留言,作者繼續(xù)改進;
o_O???
如果您需要相關(guān)功能的代碼定制化開發(fā),可以留言私信作者;
(????)
感謝各位大佬童鞋們的支持!
( ′ ▽′ )ノ ( ′ ▽′)っ!!!