OpenGL(开放图形库)是一种独立于平台的图形标准和API,可用于桌面,工作站和移动设备。它旨在提供硬件加速渲染,因此与传统软件渲染相比,性能大大提高。 OpenGL用于CAD软件和计算机游戏等应用程序。 OpenGL标准以及OpenGL ES由Khronos集团控制。
我正在尝试创建一个类来在Mac上使用OpenGL创建正常形状(等边形状)。 给定的参数是中心坐标(double center[2]),从中心到顶点的半径(double
当我尝试在 OpenGL 中使用 GL_POLYGON 时遇到问题。我不知道如何解释这一点,但我的所有顶点都与第一个顶点相连。当我尝试为对象着色时出现问题......
Visual Studio 调试器对于调试我的 OpenGL 代码有用吗?
是否可以使用 Visual Studio 调试器来调试我的 GLFW/OpenGL 代码?我在 glDrawElements() 调用上遇到异常,它提供了无用的信息。显然我没有正确设置...
我已经安装了OpenGL调试回调并启用了GL_DEBUG_OUTPUT。回调看起来像这样: void glMsgCallback( GLenum 源, GLenum型, GLuint id, ...
问题:为什么找不到-lGL? 信息:今天早上我在上网本上按照该网站的指导编写了一个程序,它编译并运行没有问题。然后我继续采用完全相同的代码......
我正在尝试从旧版 OpenGL 2.x 开始自学 OpenGL,其中对着色器的支持很少,并尝试了解 GPU 和 OpenGL 的工作原理。我的主要学习来源是...
我已经遵循了 PBR 的 LearnOpenGL 教程并获得了附加的输出,虽然看起来不错,但我注意到我在 sketchfab 或 UE5 中看到的结果更加真实,因此我试图了解...
我正在做一个使用OpenGL的项目,其中服务器需要渲染两个图像:一个高质量图像和一个低质量图像。目标是计算两者之间的差异图像并发送
在 Xcode 中的项目中,我选择了“将文件添加到项目”并选择了整个 glm 子文件夹(有人告诉我这是使用 glm 所需的全部内容)。然后,在我的 main.cpp 文件中,我编写了#include glm....
QT 和 opengl 64 位相对于 32 位的优势 [已关闭]
虽然搜索了一段时间,但我找不到任何明确的答案来说明编译 64 位程序比 32 位程序有什么好处。 我在 SO 上发现了很多关于如何编译 32 或...的问题
我正在熟悉 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; }
我正在研究光泽库,作为任何一个理智的人,我对缺乏抗锯齿功能感到非常恼火。我知道一些 OpenGL 窗口提示有助于启用抗锯齿功能,尤其是 GL。
我有一个简单的自定义画布 导入com.jogamp.opengl.GL; 导入 com.jogamp.opengl.GL2; 导入 com.jogamp.opengl.GLAutoDrawable; 导入 com.jogamp.opengl.GLEventListener; 导入 com.jogamp.opengl...
我正在编写代码来导入 OBJ 并使用 OpenGL 应用环境映射。首先,我成功地使用立方体贴图在屏幕上显示天空盒纹理。然而我申请失败了
使用glfw与glad和stb_image来渲染带有纹理的矩形(遵循learnopengl.com),但是在我获得矩形渲染后,当glfwPollEvents为
我使用以下顶点着色器绘制一个抗锯齿圆角正方形作为地平面,以便模型位于顶部: #版本330 输出 vec2 tex; 统一mat4 mvp; const vec2 pos[4] = vec2[]( vec2(...
glUniformMatrix4fv 导致 GL_INVALID_OPERATION
当我在下面的代码中调用 glUniformMatrix4fv 或 glUniform4fv 时,它每次都会引发 GL_INVALID_OPERATION,我尝试更改传递矩阵数据的方式、传递 id 的计数,我已经检查了
为什么要使用外部 OpenGL 加载器函数而不是 GLAD 的内置加载器?
我已经使用 GLAD 和 SFML 一段时间了,并且我一直在使用 GLAD 的内置函数加载器,gladLoadGL,它对我来说工作得很好。现在我正在查看 GLFW,它的 gui 中都写着...
glGetBufferSubData pyopengl 随机结果和段错误
为了扩展我的库中的一些内容,我需要将数据从 VBO 读回 CPU 内存。这里不涉及转换反馈。 当我从缓冲区读取数据时,我要么得到“随机数据”,要么得到“