glfw 相关问题

GLFW是一个免费的开源多平台库,用于打开窗口,创建OpenGL上下文和管理输入。它很容易集成到现有的应用程序中,并没有声称主循环。 GLFW是用C语言编写的,并且对Windows,Mac OS X以及使用X Window系统的许多类Unix系统(例如Linux和FreeBSD)提供原生支持。 GLFW根据zlib / libpng许可证授权。

在 macOS 上使用 VSCode 未定义 OpenGL 符号?

帮我解决下一个问题: 我们有以下文件序列: 四_三角形01.cpp #包括 // 发光 #定义GLEW_STATIC #包括 // GLFW #包括 帮我解决下一个问题: 我们有下一个文件序列: 四_三角形01.cpp #include <iostream> // GLEW #define GLEW_STATIC #include <GL/glew.h> // GLFW #include <GLFW/glfw3.h> const GLint WIDTH = 800, HEIGHT = 600; // Shaders // for line width: "gl_LineWidth = 1.5;\n" const GLchar* vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec3 position;\n" "void main()\n" "{\n" "gl_Position = vec4(position.x, position.y, position.z, 1.0);\n" "gl_PointSize = 50.0;\n" "}\0"; const GLchar* fragmentShaderSource = "#version 330 core\n" "out vec4 color;\n" "void main()\n" "{\n" "color = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; GLFWwindow* init_window () { // Init GLFW glfwInit( ); // Set all the required options for GLFW glfwWindowHint( GLFW_CONTEXT_VERSION_MAJOR, 3 ); glfwWindowHint( GLFW_CONTEXT_VERSION_MINOR, 3 ); glfwWindowHint( GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE ); glfwWindowHint( GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE ); glfwWindowHint( GLFW_RESIZABLE, GL_FALSE ); // Create a GLFWwindow object that we can use for GLFW's functions GLFWwindow *window = glfwCreateWindow( WIDTH, HEIGHT, "Four Triangles", nullptr, nullptr ); int screenWidth, screenHeight; glfwGetFramebufferSize( window, &screenWidth, &screenHeight ); if ( nullptr == window ) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate( ); } glfwMakeContextCurrent( window ); // Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions glewExperimental = GL_TRUE; // Initialize GLEW to setup the OpenGL Function pointers if ( GLEW_OK != glewInit( ) ) { std::cout << "Failed to initialize GLEW" << std::endl; } // Define the viewport dimensions glViewport( 0, 0, screenWidth, screenHeight ); return window; } // The MAIN function, from here we start the application and run the game loop int main() { GLFWwindow* window = init_window(); glEnable(GL_PROGRAM_POINT_SIZE); glEnable(GL_LINE_SMOOTH); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Build and compile our shader program // Vertex shader GLuint vertexShader = glCreateShader( GL_VERTEX_SHADER ); glShaderSource( vertexShader, 1, &vertexShaderSource, NULL ); glCompileShader( vertexShader ); // Check for compile time errors GLint success; GLchar 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 shader GLuint fragmentShader = glCreateShader( GL_FRAGMENT_SHADER ); glShaderSource( fragmentShader, 1, &fragmentShaderSource, NULL ); glCompileShader( fragmentShader ); // Check for compile time errors glGetShaderiv( fragmentShader, GL_COMPILE_STATUS, &success ); if ( !success ) { glGetShaderInfoLog( fragmentShader, 512, NULL, infoLog ); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } // Link shaders GLuint shaderProgram = glCreateProgram( ); glAttachShader( shaderProgram, vertexShader ); glAttachShader( shaderProgram, fragmentShader ); glLinkProgram( shaderProgram ); // Check for linking errors glGetProgramiv( 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 lineWidth[2]; glGetFloatv(GL_LINE_WIDTH_RANGE, lineWidth); // Set up vertex data (and buffer(s)) and attribute pointers GLfloat vertices[] = { 0.0, 0.0, 0.5, 0.0, 0.5, 0.5, 0.0, 0.0, 0.0, 0.5, -0.5, 0.5, 0.0, 0.0, -0.5, 0.0, -0.5, -0.5, 0.0, 0.0, 0.0, -0.5, 0.5, -0.5, }; GLuint VBO, VAO; glGenVertexArrays( 1, &VAO ); glGenBuffers( 1, &VBO ); // Bind the Vertex Array Object first, then bind and set vertex buffer(s) and attribute pointer(s). glBindVertexArray( VAO ); glBindBuffer( GL_ARRAY_BUFFER, VBO ); glBufferData( GL_ARRAY_BUFFER, sizeof( vertices ), vertices, GL_STATIC_DRAW ); GLint position_attribute = glGetAttribLocation(shaderProgram, "position"); glVertexAttribPointer(position_attribute, 2, GL_FLOAT, GL_FALSE, 0, 0); //glVertexAttribPointer( 0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof( GLfloat ), ( GLvoid * ) 0 ); glEnableVertexAttribArray(position_attribute ); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glBindBuffer( GL_ARRAY_BUFFER, 0 ); // Note that this is allowed, the call to glVertexAttribPointer registered VBO as the currently bound vertex buffer object so afterwards we can safely unbind glBindVertexArray( 0 ); // Unbind VAO (it's always a good thing to unbind any buffer/array to prevent strange bugs) //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); // Game loop while ( !glfwWindowShouldClose( window ) ) { // Check if any events have been activiated (key pressed, mouse moved etc.) and call corresponding response functions glfwPollEvents( ); // Render // Clear the colorbuffer glClearColor( 0.2f, 0.3f, 0.3f, 1.0f ); glClear( GL_COLOR_BUFFER_BIT ); // Draw our first triangle glUseProgram( shaderProgram ); glBindVertexArray( VAO ); glDrawArrays( GL_TRIANGLES, 0, 12); glBindVertexArray( 0 ); // Swap the screen buffers glfwSwapBuffers( window ); } // Properly de-allocate all resources once they've outlived their purpose glDeleteVertexArrays( 1, &VAO ); glDeleteBuffers( 1, &VBO ); // Terminate GLFW, clearing any resources allocated by GLFW. glfwTerminate( ); return EXIT_SUCCESS; } 任务.json { // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tasks.json format "version": "2.0.0", "tasks": [ { "type": "shell", "label": "clang++ build active file", "command": "/usr/bin/clang++", "args": [ "-std=c++17", "-stdlib=libc++", "-g", "${file}", "-I/Users/Armonicus/MyProjects/C++VSCodeProjects/projects/helloworld01/include", "/usr/local/Cellar/glfw/3.3.3/lib/libglfw.3.3.dylib", "/usr/local/Cellar/glew/2.2.0_1/lib/libGLEW.2.2.0.dylib", "-o", "${fileDirname}/src/${fileBasenameNoExtension}", "-Wno-deprecated", "-Wno-pragma-once-outside-header" ], "options": { "cwd": "${workspaceFolder}" }, "problemMatcher": ["$gcc"], "group": { "kind": "build", "isDefault": true } } ] } c_cpp_properties.json { "configurations": [ { "name": "Mac", "includePath": [ "${workspaceFolder}/**", "${workspaceFolder}/include" ], "defines": [], "macFrameworkPath": [ "/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks" ], "compilerPath": "/usr/bin/clang++", "intelliSenseMode": "macos-gcc-x64", "configurationProvider": "go2sh.cmake-integration" } ], "version": 4 } 这些是我在编译时收到的错误: 因此,我寻求帮助来解决这个问题,并最终能够直接从 VSCode IDE 在 MacO 上运行用 C++ 编写的 OpenGL 应用程序。 将以下代码放入您的task.json文件中: "args": [ "-g", "${file}", "-lGLEW", "-lglfw", "-framework", "OpenGL", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], (这对我有用。) 您必须放置编译标志/选项并告诉编译器您正在使用 OpenGL。 您是否将这些命令添加到了 task.json 中的 args 数组中? "-lglfw3", "-framework", "Cocoa", "-framework", "OpenGL", "-framework", "IOKit", 或查看本页底部的最新命令(https://www.glfw.org/docs/latest/build_guide.html)->“在 macOS 上使用命令行”

回答 2 投票 0

了解顶点数组对象、顶点缓冲区对象和索引缓冲区对象/元素缓冲区对象用于渲染每个模型的多个网格

我正在使用 C++ 和 OpenGL 3.3/GLFW 构建 .obj 加载器作为练习。我能够加载和渲染简单的一个网格模型,但我正在对其进行调整以处理包含多个的模型...

回答 1 投票 0

当for循环大于0时,ImGui Button无法识别点击?

这是我的代码的当前片段: ... 类对象A{ 民众: 整数ID; std::字符串名称; std::字符串描述; }; ... 对象A; a.id = 1; a.name =“冰箱...

回答 1 投票 0

如何修复按键回调函数和 glfwSetKeyCallback 之间的参数类型不匹配问题?

我创建了一个包含 std::map 的键盘映射的 Camera 类 我创建了一个 Camera 类,其中包含 std::map<int, void(Camera::*)() 的键盘映射,以方便游戏中的键绑定选项和比使用 switch 语句可以完成的更高性能的键操作查找。 我无法使用 glfwSetKeyCallback 函数从键盘映射访问操作功能,并且我一直遇到 keyCallback 函数和 GLFWkeyfun 之间的签名不匹配的情况。 这是Camera课程: class Camera { Camera(); private: void Mouse_Input(); void Joystick_input(); void keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods); void forward() { position += velocity * Orientation; } void backward() { position -= velocity * Orientation; } void left() {// Left position -= velocity * glm::normalize(glm::cross(Orientation, Up)); } void right() { position += velocity * glm::normalize(glm::cross(Orientation, Up)); } void up() { position += velocity * Up; } void down() { position -= velocity * Up; } void sprint() { velocity *= 2.f; } void noclip() { noClip = !noClip; if (!noClip) { gravity(position, velocity); } } void close() { glfwSetWindowShouldClose(Window::handle, true); } public: alignas(16) glm::mat4 view; alignas(16) glm::mat4 proj; alignas(16) glm::vec3 position; void update(float FOVdeg, float nearPlane, float farPlane); protected: bool noClip = true; bool firstClick = true; float velocity = 0.05f; float sensitivity = 1.75f; glm::vec3 Orientation; glm::vec3 Up; using pfunc = void (Camera::*)(); std::map<int, pfunc> keyboard_map { { GLFW_KEY_W, &Camera::forward }, { GLFW_KEY_A, &Camera::left }, { GLFW_KEY_S, &Camera::backward }, { GLFW_KEY_D, &Camera::right }, { GLFW_KEY_SPACE, &Camera::up }, { GLFW_KEY_LEFT_CONTROL, &Camera::down }, { GLFW_KEY_LEFT_SHIFT, &Camera::sprint }, { GLFW_KEY_V, &Camera::noclip }, { GLFW_KEY_ESCAPE, &Camera::close } }; }; 这些是我的 cpp 文件中的相关函数定义: void Camera::keyCallBack(GLFWwindow* window, int key, int scancode, int action, int mods) { if (!GLFW_PRESS | !GLFW_REPEAT) { return; } auto afunc = keyboard_map[key];//gets camera action function from map (this->*afunc)();//executes action function } void Camera::update(float FOVdeg, float nearPlane, float farPlane) { if (glfwJoystickPresent(GLFW_JOYSTICK_1)) {//Check for joystick std::jthread t_Console([&] { Joystick_input(); }); } std::jthread t_PC([this] { glfwSetKeyCallback(Window::handle, &Camera::keyCallBack); }); //Line causing the error std::jthread t_mouse([&] { Mouse_Input(); }); if (!noClip) { gravity(position, velocity); } view = glm::lookAt(position, position + Orientation, Up); proj = glm::perspective(glm::radians(FOVdeg), (float)GPU::Extent.width / GPU::Extent.height, nearPlane, farPlane); proj[1][1] *= -1; } 我尝试了这个解决方案,它允许我编译程序,但是在调用 auto afunc = keyboard_map[key]; 函数的 keyCallBack 行时,程序崩溃了,但没有产生错误代码。 std::jthread t_test([this]() { glfwSetKeyCallback(Window::handle, [](GLFWwindow* window, int key, int scancode, int action, int mods) { auto* instance = static_cast<Camera*>(glfwGetWindowUserPointer(window)); if (instance) { instance->keyCallBack(window, key, scancode, action, mods); } }); } ); 我完全找不到这个问题的解决方案。有人可以帮助我理解为什么我的原始方法中存在签名不匹配,为什么访问地图会导致我尝试的其他方法崩溃,以及如何让此设置按预期工作? 编辑:错误:“void(Camera::*)(GLFWwindow* window, int key, int scancode, int action, int mods)类型的参数与GLFWkeyfun类型的参数不兼容” 您正在尝试为您的 glfwSetKeyCallback() 回调使用非静态类方法。这是行不通的,因为 glfwSetKeyCallback() 需要一个 C 风格的函数指针。因此,您必须: 使 keyCallBack() 保持静态 从 keyCallBack() 类中完全删除 Camera 并将其设为独立函数 正如您所发现的,使用非捕获 lambda。 无论哪种方式,正如您已经知道的,您都可以使用 glfwSetWindowUserPointer() 将 Camera* 指针存储到 GLWindow 中,然后在回调中使用 glfwGetWindowUserPointer() 返回到 Camera 对象。但是,您显示的代码没有在任何地方调用 glfwSetWindowUserPointer()。

回答 1 投票 0

直接体渲染纹理重叠伪影

我正在尝试在 Chai3D 中使用直接体积渲染,但是有一个伪影使托管边界网格的边缘始终可见,即使在其前面有另一个对象也是如此......

回答 1 投票 0

GLFW 库无法使用 bgfx 初始化

我只是想用glfw学习bgfx,我的代码确实可以编译,但是当我尝试运行该程序时,我遇到了一些错误 #定义WDW_WIDTH 1280 #定义WDW_HEIGHT 720 #定义GLFW_INCLUDE_NONE #如果

回答 1 投票 0

用鼠标按钮旋转相机而不重置?

我想使用鼠标按钮使相机旋转。 相机旋转得很好,但问题出在鼠标按钮上。当我释放鼠标按钮并再次按下时,旋转会重置...

回答 1 投票 0

glfw3.dll 运行代码时未找到系统错误

我已经在 Visual Studio Code(代码编辑器,而不是 IDE)中设置了 GLFW。当我运行代码时,它给我一个系统错误:-找不到glfw3.dll。 这是我从 GL 文档中复制的代码...

回答 1 投票 0

使用 Bullet 物理和纹理时出现 C++ 错误

TextureLoader:文件名/root/SourceCodes/CPP/Assets/Textures/globe.jpg malloc():无效大小(未排序) 当我尝试运行这个时: // 需要首先包含 GLEW #包括 // G...

回答 1 投票 0

GLEW初始化问题导致程序无法输出

我在尝试将 GLEW 库用于我的基本 OpenGL 程序时遇到问题,该程序是使用 GLFW (glfw3.h) 编写的。一切编译都没有错误,但是一旦我调用 glewIni...

回答 1 投票 0

Visual Studio 2022 找不到 glfw.dll,即使该库已链接到项目中

首先,我是 Visual Studio 2022 的新手,我现在唯一的目标是运行我在 github 上找到的代码。说明非常简单: 下载 .sln 文件 安装需要的依赖项 跑...

回答 1 投票 0

C++/xcode15/MacOs14.0 - glClear(GL_COLOR_BUFFER_BIT); - 线程1:EXC_BAD_ACCESS(代码=1,地址=0x0)

我环顾四周,显然我可以在这个解决方案之间进行选择,而我的问题与以下相同: 文本, 但我仍然不知道如何解决这个问题。 当我使用 glClear(

回答 1 投票 0

Xcode:GLFW / GLAD 默认 C 应用程序中的“线程 1:EXC_BAD_ACCESS(代码=1,地址=0x0)”

我是 GLFW 的新手,我尝试用 C 语言使用 GLFW 和 OpenGL 制作最基本的应用程序。我从 GLFW 文档中获取了示例代码:https://www.glfw.org/documentation.html。有效。

回答 2 投票 0

在 Macos xcode 中使用 GLFW 并显示:“'GLFW/glfw3.h' 文件未找到”

我已经将glfw文件获取到xcode库,但仍然失败 “找不到...文件”,为什么?在此处输入图像描述在此处输入图像描述 我该怎么办,...

回答 1 投票 0

OpenGL - 未使用颜色和顶点的动态数组生成三角形

#包括 #包括 #包括 #包括 #包括 #包括 #包括 // 顶点 Sha...

回答 1 投票 0

将鼠标坐标转换为世界空间坐标

我正在使用 GLFW,我想通过窗口上的鼠标坐标获取世界空间坐标,以在单击选定位置时绘制对象。首先,我试图仅使用

回答 2 投票 0

在 Imgui 中如何使用 glfw 处理一般鼠标事件?

我使用glfw回调函数来用鼠标移动相机。 鼠标回调函数为: void mouse_callback(GLFWwindow *窗口, 双 xposIn, 双 yposIn) { 如果(被按下) { ...

回答 4 投票 0

如何在 Zig 中投射指针

我正在尝试用 Zig 重写一个 Hello 三角形,但是我遇到了一些问题。我无法使用指针强制转换。 fn framebufferResizeCallback(window: ?*cInclude.GLFWwindow, _: c_int, _: c_int) callconv(.C) vo...

回答 1 投票 0

Zig Lang 选角

我正在尝试在 Zig Lang 中重写 Hello 三角形,但我遇到了一些问题。我无法使用指针强制转换。 fn framebufferResizeCallback(窗口: ?*cIninclude.GLFWwindow, _: c_int, _: c_int) callconv(.C) ...

回答 1 投票 0

OpenGL场景渲染失败?

我需要在 OpenGL 中创建一盏带有杆子和支架的灯。我需要对对象的每个顶点使用至少 2 个原始形状和不同的颜色。 由于某种原因,没有任何渲染。什么是...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.