GLFW是一个免费的开源多平台库,用于打开窗口,创建OpenGL上下文和管理输入。它很容易集成到现有的应用程序中,并没有声称主循环。 GLFW是用C语言编写的,并且对Windows,Mac OS X以及使用X Window系统的许多类Unix系统(例如Linux和FreeBSD)提供原生支持。 GLFW根据zlib / libpng许可证授权。
目前我正在使用glfw和glad制作一个简单的3D空间。我的项目管理方法是将其分成较小的项目,例如: 核 渲染器 场景 窗户 外部图形库
我以前遇到过此类问题(甚至在这个论坛上询问过解决方案),但这次之前的修复似乎对我不起作用。 简而言之,我正在编写一个程序,如下所示: #
CMake,Windows,致命错误:GLFW/glfw3.h:没有这样的文件或目录
尝试构建一个项目,但我一直试图让我的代码识别我的库。 我使用 Ninja 作为我的构建生成器。 CMake.txt 文件: cmake_minimum_required(版本3.15...3.31) 亲...
我正在开发一个非常简单的 Vulkan 应用程序。到目前为止,我一直在链接通过操作系统的包管理器安装的 GLFW DLL(并且我没有遇到任何问题)。下载后...
我是 OpenGL 新手,目前我正在开发用于 OpenGL 学习的测试 OpenGL 项目。该项目的组件之一是WindowManager。我尝试添加多个窗口来创建支持...
我一直在尝试实现阴影贴图,但是整个场景是黑色的,而它绝对不应该是黑色的。 我在 (4, 1, 4) 处初始化一盏灯,方向为 (0, 0, 0)。这是我的主要渲染方式...
由于未知原因,GLSL 着色器程序无法正确链接,日志为空。着色器编译正确。 尝试做: CompileShaders("数据/着色器/ui", 0b01, MainUiShader); ...给出一个呃...
我正在尝试使用官方的 metal-cpp 标头来使用 GLFW 制作一个完全 C++ 的金属应用程序。如果可能的话我不想写任何objective-c。 #定义GLFW_EXPOSE_NATIVE_COCOA #包括 我正在尝试使用 official metal-cpp headers 使用 GLFW 制作一个完全 C++ 的金属应用程序。如果可能的话我不想写任何 Objective-C。 #define GLFW_EXPOSE_NATIVE_COCOA #include <GLFW/glfw3.h> #include <GLFW/glfw3native.h> #include <Metal/Metal.hpp> #include <MetalKit/MetalKit.hpp> #include <QuartzCore/QuartzCore.hpp> int main() { glfwInit(); glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API); GLFWwindow* window = glfwCreateWindow( 1280, 720, "Hello World", nullptr, nullptr); auto nswindow = glfwGetCocoaWindow(window); /* Make the window's context current */ glfwMakeContextCurrent(window); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { /* Render here */ /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; } 我不知道这是否可能,但我现在的具体障碍是将 NSWindow 返回的 Objective-c glfwGetCocoaWindow 转换为 NS::Window C++ 对象。 使用 GLFW 时无法完全摆脱 Objective-C(++)。 您需要一个 *.h/*.m(m) 组合来向 NSWindow 添加金属层。 #ifndef COCOA_BRIDGE #define COCOA_BRIDGE #include <metal/metal.hpp> struct GLFWwindow; namespace CA { class MetalLayer; } namespace X { void add_layer_to_window(GLFWwindow* window, CA::MetalLayer* layer); } #endif #import "cocoa_bridge.h" #include <GLFW/glfw3.h> #define GLFW_EXPOSE_NATIVE_COCOA #include <GLFW/glfw3native.h> #import <QuartzCore/CAMetalLayer.h> namespace X{ void add_layer_to_window(GLFWwindow* window, CA::MetalLayer* layer) { NSWindow* cocoa_window = glfwGetCocoaWindow(window); CAMetalLayer* native_layer = (__bridge CAMetalLayer*)layer; [[cocoa_window contentView] setLayer:native_layer]; [native_layer setMaximumDrawableCount:2]; [[cocoa_window contentView] setWantsLayer:YES]; [[cocoa_window contentView] setNeedsLayout:YES]; } } auto* window = (GLFWwindow*)get_window(); layer = NS::TransferPtr(CA::MetalLayer::layer()); layer->setDevice(device.get()); layer->setFramebufferOnly(true); layer->setPixelFormat(MTL::PixelFormat::PixelFormatBGRA8Unorm_sRGB); add_layer_to_window(window, layer.get()); 整个渲染通过图层进行。 是的,这当然是可能的。 这是一个例子我刚刚放在一起。 它使用 Apple 不受支持的 metal-cpp-extensions 代码来在 CAMetalLayer 视图中设置 NSWindow,我必须修改该代码才能添加所需的选择器。 之后,我将 Objective-C 示例 移植到 C++。
OpenGL程序只显示黑屏,而它应该显示一个正方形(我使用的是fedora linux)
我正在使用 fedora Linux 进行 openGL 开发。 仅显示一个黑色窗口,没有形状或任何东西。 我认为这是操作系统或设备问题,但不知道如何解决。 我正在使用 Fedora li...
我正在尝试创建一个类来在Mac上使用OpenGL创建正常形状(等边形状)。 给定的参数是中心坐标(double center[2]),从中心到顶点的半径(double
Visual Studio 调试器对于调试我的 OpenGL 代码有用吗?
是否可以使用 Visual Studio 调试器来调试我的 GLFW/OpenGL 代码?我在 glDrawElements() 调用上遇到异常,它提供了无用的信息。显然我没有正确设置...
在 CMake/MSBuild 中与 OpenGL 和 GLFW 链接时出现链接器错误
我正在基于 CMake 的设置中使用 GLFW 和 Glad 开发 OpenGL 项目,并且遇到与 Glad 相关的链接器错误。我已经将项目配置为使用 happy 和 OpenGL,并且我能够
我正在熟悉 ModernGL,特别是渲染到各个 glfw 窗口。我计划在一个应用程序中拥有多个 glfw 窗口,每个窗口都包含在自己的 QtWidg 中......
我将 OpenGL 与 GLEW 和 GLFW 一起使用。我创建了两个着色器,它们编译得很好: #包括 #包括 #包括 #包括 我将 OpenGL 与 GLEW 和 GLFW 一起使用。我创建了两个着色器,它们编译得很好: #include <iostream> #include <GL/glew.h> #include <OpenGL/OpenGL.h> #include <GLFW/glfw3.h> static unsigned int CompileShader( unsigned int type, const std::string source){ unsigned int id = glCreateShader(type); const char* src = source.c_str(); glShaderSource(id, 1, &src, nullptr); glCompileShader(id); int result; glGetShaderiv(id, GL_COMPILE_STATUS, &result); if (result == GL_FALSE){ int length; glGetShaderiv(id, GL_INFO_LOG_LENGTH, &length); char* message = (char*)alloca(length * sizeof(char)); glGetShaderInfoLog(id, length, &length, message); std::cout <<"failed to compile " << (type == GL_VERTEX_SHADER ? "vertex" : "fragment") << " shader" <<"\n"; std::cout << message << "\n"; glDeleteShader(id); return 0; } return id; } static int CreateShader(const std::string& VertexShader, const std::string& FragmentShader){ unsigned int program = glCreateProgram(); unsigned int vs = CompileShader(GL_VERTEX_SHADER, VertexShader); unsigned int fs = CompileShader(GL_FRAGMENT_SHADER, FragmentShader); glAttachShader(program, vs); glAttachShader(program, fs); glLinkProgram(program); glValidateProgram(program); glDeleteShader(vs); glDeleteShader(fs); return program; } int main(void){ /* Initialize the library */ GLFWwindow* window; if (!glfwInit()){return -1;} 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 /* Create a windowed mode window and its OpenGL context */ window = glfwCreateWindow(640, 480, "Gaston", NULL, NULL); if (!window){ glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent(window); if (glewInit() != GLEW_OK){ std::cout <<"glewunit(); failed\n"; } float positions[6] = { -0.5f, -0.5f, -.9f, .5f, 0.5f, 0.5f }; unsigned int buffer; glGenBuffers(1, &buffer); glBindBuffer(GL_ARRAY_BUFFER, buffer); glBufferData(GL_ARRAY_BUFFER, sizeof(positions) * sizeof(float), positions, GL_STATIC_DRAW); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float)*2, 0); glBindBuffer(GL_ARRAY_BUFFER, 0); std::string vertexshader = "#version 330 core\n" "\n" "layout(location = 0) in vec4 position;\n" "\n" "void main()\n" "{\n" " gl_Position = position;\n" "}\n"; std::string fragmentshader = "#version 330 core\n" "\n" "layout(location = 0) out vec4 colour;\n" "\n" "void main()\n" "{\n" " colour = vec4(1.0, 0.0, 0.0, 1.0);\n" "}\n"; unsigned int shader = CreateShader(vertexshader, fragmentshader); glUseProgram(shader); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)){ /* Render here */ glClear(GL_COLOR_BUFFER_BIT); glDrawArrays(GL_TRIANGLES, 0, 3); /* Swap front and back buffers */ glfwSwapBuffers(window); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; } ...但是三角形没有出现。我得到的只是一个空白屏幕。 理想的结果是红色三角形。 一些事情: 作为@G.M.指出您需要绑定和填充顶点数组对象(VAO)(使用 VBO 绑定和顶点属性启用)才能在 Core 上下文中渲染事物。 例如: GLuint vao = 0; glCreateVertexArrays(1, &vao); glBindVertexArray(vao); 着色器链接也可能失败,请务必通过 glGetProgramiv() & co. 检查这一点 调试上下文和调试消息回调将显示 glDrawArrays() 调用抛出 GL_INVALID_OPERATION: if( glewIsSupported( "GL_ARB_debug_output" ) ) { glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); glDebugMessageControlARB( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE ); glDebugMessageCallbackARB( []( GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar* message, const void* ) { std::cerr << "GL: " << message << std::endl; }, 0 ); } 输出: GL: GL_INVALID_OPERATION in glDrawArrays 大家一起: // g++ main.cpp $(pkg-config --cflags --libs glew glfw3) #include <GL/glew.h> #include <GLFW/glfw3.h> #include <iostream> void CheckStatus( GLuint obj, bool isShader ) { GLint status = GL_FALSE, log[ 1 << 11 ] = { 0 }; ( isShader ? glGetShaderiv : glGetProgramiv )( obj, isShader ? GL_COMPILE_STATUS : GL_LINK_STATUS, &status ); if( status == GL_TRUE ) return; ( isShader ? glGetShaderInfoLog : glGetProgramInfoLog )( obj, sizeof( log ), NULL, (GLchar*)log ); std::cerr << (GLchar*)log << "\n"; std::exit( EXIT_FAILURE ); } void AttachShader( GLuint program, GLenum type, const char* src ) { GLuint shader = glCreateShader( type ); glShaderSource( shader, 1, &src, NULL ); glCompileShader( shader ); CheckStatus( shader, true ); glAttachShader( program, shader ); glDeleteShader( shader ); } const char* const vert = R"GLSL( #version 330 core layout( location = 0 ) in vec4 position; void main() { gl_Position = position; }; )GLSL"; const char* const frag = R"GLSL( #version 330 core layout(location = 0) out vec4 colour; void main() { colour = vec4( 1.0, 0.0, 0.0, 1.0 ); }; )GLSL"; int main( void ) { /* Initialize the library */ glfwSetErrorCallback( []( int, const char* desc ) { std::cerr << desc << "\n"; std::exit( EXIT_FAILURE ); } ); if( !glfwInit() ) { return -1; } 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 glfwWindowHint( GLFW_OPENGL_DEBUG_CONTEXT, GL_TRUE ); /* Create a windowed mode window and its OpenGL context */ GLFWwindow* window = glfwCreateWindow( 640, 480, "Gaston", NULL, NULL ); if( !window ) { glfwTerminate(); return -1; } /* Make the window's context current */ glfwMakeContextCurrent( window ); if( glewInit() != GLEW_OK ) { std::cout << "glewunit(); failed\n"; } if( glewIsSupported( "GL_ARB_debug_output" ) ) { glEnable( GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB ); glDebugMessageControlARB( GL_DONT_CARE, GL_DONT_CARE, GL_DONT_CARE, 0, NULL, GL_TRUE ); glDebugMessageCallbackARB( []( GLenum, GLenum, GLuint, GLenum, GLsizei, const GLchar* message, const void* ) { std::cerr << "GL: " << message << std::endl; }, 0 ); } float positions[ 6 ] = { -0.5f, -0.5f, -.9f, .5f, 0.5f, 0.5f }; GLuint vao = 0; glCreateVertexArrays(1, &vao); glBindVertexArray(vao); unsigned int buffer; glGenBuffers( 1, &buffer ); glBindBuffer( GL_ARRAY_BUFFER, buffer ); glBufferData( GL_ARRAY_BUFFER, sizeof( positions ) * sizeof( float ), positions, GL_STATIC_DRAW ); glEnableVertexAttribArray( 0 ); glVertexAttribPointer( 0, 2, GL_FLOAT, GL_FALSE, sizeof( float ) * 2, 0 ); glBindBuffer( GL_ARRAY_BUFFER, 0 ); GLuint prog = glCreateProgram(); AttachShader( prog, GL_VERTEX_SHADER, vert ); AttachShader( prog, GL_FRAGMENT_SHADER, frag ); glLinkProgram( prog ); CheckStatus( prog, false ); glUseProgram( prog ); /* Loop until the user closes the window */ while( !glfwWindowShouldClose( window ) ) { /* Render here */ glClear( GL_COLOR_BUFFER_BIT ); glDrawArrays( GL_TRIANGLES, 0, 3 ); /* Swap front and back buffers */ glfwSwapBuffers( window ); /* Poll for and process events */ glfwPollEvents(); } glfwTerminate(); return 0; }
使用glfw与glad和stb_image来渲染带有纹理的矩形(遵循learnopengl.com),但是在我获得矩形渲染后,当glfwPollEvents为
我在 Windows 上,使用 c++17 并尝试在我的一个项目中使用 GLFW。这是我尝试过的,但它不起作用: 我在 VS Code 中打开了一个空文件夹,并添加了 src 和 Dependencies 文件夹...
我试图为我正在开发的一个OpenGL项目设置纹理渲染,但我无法让它工作,因为显然glTexImage2D函数的最后一个参数是nint。我在网上查了一下...
为什么要使用外部 OpenGL 加载器函数而不是 GLAD 的内置加载器?
我已经使用 GLAD 和 SFML 一段时间了,并且我一直在使用 GLAD 的内置函数加载器,gladLoadGL,它对我来说工作得很好。现在我正在查看 GLFW,它的 gui 中都写着...
在Vulkan中实现分层纹理深度缓冲的问题 我正在学习 Vulkan 教程,并已经实现了包括纹理在内的所有内容。 然而,相反...
我只是想通过 GLFW 让 OpenGL 在我的机器(Windows 7 64 位)上工作。 我收到单一链接器错误: 对“glfwInit”的未定义引用。 我试图编译的代码是