glfw 相关问题

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

OpenGL:纹理加载

我正在创建一个 3D 金字塔并为其加载砖墙纹理。 我最初让金字塔工作,但是当我尝试添加纹理时,它无法加载,并且留下一个黑色窗口: #

回答 1 投票 0

GLFW 线程处理?

我正在窗口中制作 GL 渲染器。程序本身工作正常,但是当我“线程”渲染循环时(正如我对网络类所做的那样,所以我猜测它应该工作),程序打开并

回答 1 投票 0

如何在OpenGL中设置特定比例?

我正在使用 C++ 和 OpenGL。但我需要将对象缩放到一定比例。对于游戏引擎来说。 我的目标只是设置而不是更改比例。 #定义GLFW_INCLUDE_NONE #包括 我正在使用 C++ 和 OpenGL。但我需要将对象缩放到一定比例。对于游戏引擎来说。 我的目标只是设置比例而不是更改。 #define GLFW_INCLUDE_NONE #include <glm/glm.hpp> #include <glm/gtc/type_ptr.hpp> #include <GLFW/glfw3.h> #include <Glad/glad.h> #include "vendor/ImGui/imgui.h" #include "vendor/ImGui/backends/imgui_impl_glfw.h" #include "vendor/ImGui/backends/imgui_impl_opengl3.h" #include <stdio.h> #define WINDOW_WIDTH 640 #define WINDOW_HEIGHT 480 void error_callback(int error, const char* description) { fprintf(stderr, "Error: %s\n", description); } const char* vertexShaderSource = "#version 330 core\n" "layout(location = 0) in vec3 aPos;\n" "uniform mat4 projection;\n" "void main()\n" "{\n" " gl_Position = projection * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n" "}\0"; const char* fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "uniform vec2 wsize;\n" "void main()\n" "{\n" " vec2 position = gl_FragCoord.xy;\n" " FragColor = vec4(position.x/wsize.x, position.x/position.y/wsize.x,position.y/wsize.y, 1.0f);\n" "}\n\0"; float aspectRatio; glm::mat4 projection; void framebuffer_size_callback(GLFWwindow* window, int width, int height) { glViewport(0, 0, width, height); aspectRatio = (float)width / (float)height; projection = glm::ortho(-aspectRatio, aspectRatio, -1.0f, 1.0f, -1.0f, 1.0f); } int main() { if (!glfwInit()) { // Initialization failed } glfwSetErrorCallback(error_callback); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); GLFWwindow* window = glfwCreateWindow(640, 480, "GL YA!", NULL, NULL); if (!window) { // Window or context creation failed } glfwMakeContextCurrent(window); gladLoadGL(); glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); float vertices[9 * 2] = { -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f, 0.5f, 0.5f, 0.0f, 0.5f, 0.5f, 0.0f, -0.5f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, }; glfwSwapInterval(1); GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); GLuint shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); glDeleteShader(vertexShader); glDeleteShader(fragmentShader); GLuint VBO; glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); GLuint VAO; glGenVertexArrays(1, &VAO); glBindVertexArray(VAO); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); IMGUI_CHECKVERSION(); ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); (void)io; io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; // Enable Keyboard Controls io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad; // Enable Gamepad Controls io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; io.ConfigDockingWithShift = false; ImGui::StyleColorsDark(); const char* glsl_version = "#version 100"; ImGui_ImplGlfw_InitForOpenGL(window, true); ImGui_ImplOpenGL3_Init(glsl_version); float x = 0; float y = 0; float z = 0; while (!glfwWindowShouldClose(window)) { int width, height; glfwGetFramebufferSize(window, &width, &height); framebuffer_size_callback(window, width, height); ImGui_ImplOpenGL3_NewFrame(); ImGui_ImplGlfw_NewFrame(); ImGui::NewFrame(); ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode); ImGui::Begin("Hello OpenGL!"); ImGui::InputFloat("X", &x); ImGui::InputFloat("Y", &y); ImGui::InputFloat("Z", &z); ImGui::End(); ImGui::Render(); glViewport(0, 0, width, height); glClear(GL_COLOR_BUFFER_BIT); //Square glUseProgram(shaderProgram); GLint wsize = glGetUniformLocation(shaderProgram, "wsize"); glUniform2f(wsize, width, height); /* glm::mat4 transform = glm::mat4(1.0f); // Start with an identity matrix transform = glm::translate(transform, glm::vec3(x, y, z)); // Move the triangle along the x and y axes for (int i = 0; i < 9 * 2; i += 3) { glm::vec4 vertex = transform * glm::vec4(vertices[i], vertices[i + 1], vertices[i + 2], 1.0f); vertices[i] = vertex.x; vertices[i + 1] = vertex.y; vertices[i + 2] = vertex.z; } */ float currentX = 0.0f; float currentY = 0.0f; float currentZ = 0.0f; for (int i = 0; i < 9 * 2; i += 3) { currentX += vertices[i]; currentY += vertices[i + 1]; currentZ += vertices[i + 2]; } currentX /= 9; currentY /= 9; currentZ /= 9; float tx = x - currentX; float ty = y - currentY; float tz = z - currentZ; for (int i = 0; i < 9 * 2; i += 3) { vertices[i] += tx; vertices[i + 1] += ty; vertices[i + 2] += tz; } for (int i = 0; i < 9 * 2; i += 3) { vertices[i] += x; vertices[i + 1] += y; vertices[i + 2] += z; } glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 6); //ImGui ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); } 我不知道该怎么办。我想要一个精确的变量来设置,而不是改变大小。 我正在寻找使用 glm 的解决方案,稍后我会将所有内容放入类中。 如果您有网格的顶点数据并且想要缩放对象而不迭代网格数据,那么解决方案是让着色器为您完成此操作。 为此,我们只需要在顶点着色器中引入一个uniform变量即可。 在应用变换之前,我们首先必须缩放顶点位置,例如 //vertex shader in vec3 aPos; //position coords uniform vec3 uScale; //scale factor uniform mat4 uProjection; //mvp matrix int main() { gl_Position = uProjection * vec4(aPos * uScale, 1.0); }

回答 1 投票 0

尝试使用 gcc 编译我的 opengl 项目时出现链接器错误

我使用 glfw 和 glew 来创建窗口,它给了我链接器错误。我该如何解决它。这是我第一次安装 glfw 和 glew,所以我可能错过了安装步骤。任何...

回答 1 投票 0

ImGui 与令人高兴的 openGL 加载器抛出分段错误(核心转储)

我是 ImGui 库的新手,最近我一直在尝试其中包含的示例。一切都像魅力一样工作,直到我将 gl3w 的包含(和功能)更改为 happy(我想要的加载器......

回答 1 投票 0

<glad/glad.h>:没有这样的文件或目录

我正在按照本教程学习 OpenGL,但由于编译器找不到头文件之一,因此我在编译时遇到了问题。 这是我正在尝试编译的文件: #包括 我正在按照 本教程 学习 OpenGL,但由于编译器找不到头文件之一,所以我在编译时遇到问题。 这是我正在尝试编译的文件: #include <glad/glad.h> #include <GLFW/glfw3.h> int main() { return 0; } 为了编译,我正在使用 $ gcc -o sandbox sandbox.cpp -lGL -lGLU -lglut 我收到以下错误: sandbox.cpp:1:23: fatal error: glad/glad.h: No such file or directory #include <glad/glad.h> ^ compilation terminated. 我遵循了 此 wiki 的前两部分 安装 OpenGL 和库。 我认为问题要么是错误的编译命令,要么是我的 OpenGL 安装中存在缺陷。 GLAD 是 OpenGL 的函数加载器。本教程解释了如何设置。 教程解释了 GLAD 的目的: 由于OpenGL驱动有很多不同的版本,其大部分函数的位置在编译时是未知的,需要在运行时查询。 GLAD 的设置涉及使用 Web 服务器生成特定于您的 GL 版本、扩展和语言的源文件和头文件。然后将源文件和头文件放置在项目的 src 和 include 目录中。 如果您正在查看这个简单的GLFW示例,您可以删除glad/gl.h包含,以及 gladLoadGL(glfwGetProcAddress); 再往下走。 如果您使用的是 Linux,例如 ubuntu, 你不需要很高兴,只需添加这两个标题即可: #include <GLES2/gl2.h> #include <EGL/egl.h> 如果示例保存为glfw_ex2.c,您可以在命令行中编译它,如下所示: g++ glfw_ex2.c -lglfw -lGLESv2 当然,对于本示例,linmath.h 必须存在于同一目录中。 如果缺少什么,可以这样安装并再次尝试编译: sudo apt install libglfw3-dev libgles2-mesa-dev libegl1-mesa-dev sudo apt install build-essential 然后像这样运行它: ./a.out 我建议你在VSCode中按F5运行并调试程序,如果你将目录中名为“mingw32-make.exe”的文件更改为“make.exe”,你可以尝试执行命令“make run”存在文件“makefile”

回答 3 投票 0

是什么让 pthread 成为“主”线程?

是什么让 pthread 成为“主线程”? 我这样问是因为某些 GLFW 函数只能从主线程调用。我了解线程安全的概念。但有什么特别的...

回答 1 投票 0

如何将GLFW与openGL一起使用?

我正在尝试编译一个简短的 openGl 和 GLFW 代码,但我失败了.. 我已经包含了所有 .h ,如下所示: #包括 #包括 #包括 #包括...

回答 2 投票 0

尝试构建 GLEW 项目时出现 MinGW 链接器错误,尽管库(glew32.a)似乎没问题

我在使用 Cmake 链接我的 OpenGL 项目时遇到问题。 为了使用 OpenGL 扩展,我下载了预构建的 GLEW 库二进制文件。 但在构建我的项目后,我收到了很多警告: 跳过

回答 1 投票 0

在 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

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