OpenGL(开放图形库)是一种独立于平台的图形标准和API,可用于桌面,工作站和移动设备。它旨在提供硬件加速渲染,因此与传统软件渲染相比,性能大大提高。 OpenGL用于CAD软件和计算机游戏等应用程序。 OpenGL标准以及OpenGL ES由Khronos集团控制。
所以我正在尝试使用 Qt 为我的游戏实现一个编辑器,但我似乎无法破译 QOpenGLWidget 的工作原理。现在,我只想得到一个简单的三角形来渲染,然后我就可以担心
使用PyQt6和OpenGL绘制三角形(重写Qt6 C++示例)
我当前的 PyQt6 示例不显示窗口,也不给我任何错误消息。这个 PyQt6 示例只是 Qt C++ 的副本。以下 Qt C++ 示例即使在
我终于得到了一个使用纹理的四边形,为了清理我的代码,我决定将它移到一个单独的类中,但现在它消失了,没有任何错误消息。 主要文件: #包括 我终于得到了一个使用纹理的四边形,为了清理我的代码,我决定将它移到一个单独的类中,但现在它消失了,没有任何错误消息。 主文件: #include <glad/glad.h> #include <GLFW/glfw3.h> #include <stb/stb_image.h> #include <texture.h> #include <window.h> #include <shader.h> #include <model.h> #include <iostream> GLfloat vertexes[] { 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, -0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, -0.5, 0.5, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, -0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; const int width = 1900; const int height = 1200; int main() { glfwInit(); window window(width, height, "Voxel Engine"); gladLoadGL(); glViewport(0, 0, width, height); // shader shader_program shader("src/shaders/vertex_shader.shader", "src/shaders/fragment_shader.shader"); model model1(vertexes); /*// vao and vbo unsigned int vbo, vao; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0);*/ texture test_img("resources/test_img.png", GL_TEXTURE0, GL_RGB, GL_UNSIGNED_BYTE); test_img.uniform_shader(shader, "tex_0", 0); while (!glfwWindowShouldClose(window.glfw_window)) { glfwPollEvents(); glClearColor(0.08, 0.12, 0.24, 1.0); glClear(GL_COLOR_BUFFER_BIT); shader.use(); //glBindTexture(GL_TEXTURE_2D, texture1); test_img.bind(); glBindVertexArray(model1.vao); glDrawArrays(GL_TRIANGLES, 0, 6); window.swap_buffers(); } glDeleteVertexArrays(1, &model1.vao); glDeleteBuffers(1, &model1.vbo); //glDeleteTextures(1, &texture1); test_img.destroy(); shader.destroy(); window.destroy(); glfwTerminate(); return 0; } 模型标题: #ifndef MODEL_CLASS_H #define MODEL_CLASS_H #include <glad/glad.h> class model { public: unsigned int vao, vbo; model(GLfloat vertexes[]); void render(); void destroy(); }; #endif 最后,模型 c++ 文件: #include <model.h> model::model(GLfloat vertexes[]) { // vao and vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } 我发现由于某种原因,vbo 和 vao 没有正确创建,但令我困惑的是我直接从 main.cpp 文件中复制了代码,但现在它不起作用。 错误就在这里 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); 在你的新代码中vertexes是一个指针。 C++ 中不可能有数组参数,它总是转换为指针。因此 sizeof(vertexes) 返回指针的大小,而不是原始数组的大小。将尺寸作为单独的参数传递。 model::model(GLfloat* vertexes, size_t vertex_size) { ... glBufferData(GL_ARRAY_BUFFER, vertex_size, vertexes, GL_STATIC_DRAW); ... }
C++、GLFW 和 GLAD。一旦我把它移到一个单独的类中,四边形就消失了
我终于得到了一个使用纹理的四边形,为了清理我的代码,我决定将它移到一个单独的类中,但现在它消失了,没有任何错误消息。 主要文件: #包括 我终于得到了一个使用纹理的四边形,为了清理我的代码,我决定将它移到一个单独的类中,但现在它消失了,没有任何错误消息。 主文件: #include <glad/glad.h> #include <GLFW/glfw3.h> #include <stb/stb_image.h> #include <texture.h> #include <window.h> #include <shader.h> #include <model.h> #include <iostream> GLfloat vertexes[] { 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, -0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.5, -0.5, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 1.0, 1.0, -0.5, 0.5, 0.0, 1.0, 1.0, 1.0, 0.0, 1.0, -0.5, -0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0 }; const int width = 1900; const int height = 1200; int main() { glfwInit(); window window(width, height, "Voxel Engine"); gladLoadGL(); glViewport(0, 0, width, height); // shader shader_program shader("src/shaders/vertex_shader.shader", "src/shaders/fragment_shader.shader"); model model1(vertexes); /*// vao and vbo unsigned int vbo, vao; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0);*/ texture test_img("resources/test_img.png", GL_TEXTURE0, GL_RGB, GL_UNSIGNED_BYTE); test_img.uniform_shader(shader, "tex_0", 0); while (!glfwWindowShouldClose(window.glfw_window)) { glfwPollEvents(); glClearColor(0.08, 0.12, 0.24, 1.0); glClear(GL_COLOR_BUFFER_BIT); shader.use(); //glBindTexture(GL_TEXTURE_2D, texture1); test_img.bind(); glBindVertexArray(model1.vao); glDrawArrays(GL_TRIANGLES, 0, 6); window.swap_buffers(); } glDeleteVertexArrays(1, &model1.vao); glDeleteBuffers(1, &model1.vbo); //glDeleteTextures(1, &texture1); test_img.destroy(); shader.destroy(); window.destroy(); glfwTerminate(); return 0; } 模型标题: #ifndef MODEL_CLASS_H #define MODEL_CLASS_H #include <glad/glad.h> class model { public: unsigned int vao, vbo; model(GLfloat vertexes[]); void render(); void destroy(); }; #endif 最后,模型 c++ 文件: #include <model.h> model::model(GLfloat vertexes[]) { // vao and vbo glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); glGenVertexArrays(1, &vao); glBindVertexArray(vao); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(3 * sizeof(float))); glEnableVertexAttribArray(1); glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (void*)(6 * sizeof(float))); glEnableVertexAttribArray(2); glBindVertexArray(0); glBindBuffer(GL_ARRAY_BUFFER, 0); } 我发现由于某种原因,vbo 和 vao 没有正确创建,但令我困惑的是我直接从 main.cpp 文件中复制了代码,但现在它不起作用。 错误就在这里 glBufferData(GL_ARRAY_BUFFER, sizeof(vertexes), vertexes, GL_STATIC_DRAW); 在新代码中,vertexes是一个指针,因此sizeof(vertexes)返回指针的大小,而不是原始数组的大小。将尺寸作为单独的参数传递。
OpenGL:如何使用模板缓冲区丢弃比绘制到模板缓冲区的多边形更近的片段?
在我正在使用的引擎中,我正在绘制一些多边形,用作各种门户的模板,并且我想剪切它的深度,从某种意义上说,我在设置模板...
使用 glBindBufferBase 和 glUniformBlockBinding,您可以连接制服和缓冲区以将数据提供给着色器。 是您将缓冲区绑定到鲥鱼之间共享的“绑定点”(索引)吗...
为什么 QQuickFramebufferObject::createRenderer 没有被调用?
我使用Qt官方的fboitem示例,但无法正确渲染。 createRenderer应该是框架内部自动调用的,打印日志发现没有调用,所以没有
我正在学习 OpenGL 和 3D 渲染的工作原理,并且我一直在关注本教程。我做的一些事情略有不同(使用 C 而不是 C++ 并使用我自己的矩阵计算
glutBitmapCharacter 在旧版本中有效,但不再
我正在恢复 2004 年的一些遗留 OpenGL 代码。在此过程中,字母的显示停止工作。 glutBitmapCharacter 不起作用,它默默地失败并且什么也没有出现。显然
如何在 qt-5 的一个顶点着色器中获得两个不同的 VBO?
我开始学习 qt-5 并尝试将两个 VBO 链接到顶点着色器,一个用于位置,另一个用于颜色。我已将它们声明为顶点着色器中名为 vertex 的变量...
我想在OpenGL中画一条线。 glBegin(GL_LINES); glVertex2f(.25,0.25); glVertex2f(.75,.75); glEnd(); 这段代码画了一条线,但是如果我想从坐标 (10,10) 到
Windows 上的 OpenGL ICD 如何加载 OpenGL 1.0 和 1.1 函数?
最近我一直在研究OpenGL图形驱动程序(ICD)如何在Windows上实现OpenGL运行时(opengl32.dll)调用的OpenGL函数。 我知道我可以使用 GetProcAddress ...
下面的代码,这两行按这个顺序 tab1.add(glWindow2); 窗口->显示(); 产生这个图像: 但是如果我将 add 调用放在 window->show 之后: 窗口->显示(); tab1.add(glWind...
我有一种编程方式(例如OpenGL命令)来确定我的GPU的OpenGL实现支持的像素中的最大线宽? 我最近使用了宽度约为 50000 的 OpenGL 缓冲区
我有一种编程方式(例如OpenGL命令)来确定我的GPU支持的像素中的最大线宽。 我最近使用了宽度约为 50000 像素的 OpenGL 缓冲区,但遇到了不好的问题...
我猜opengl应用程序的某些部分过去是在CPU上运行的,现在通过cuda人们可以在GPU上运行它,并加速这些部分(opengl应用程序或管道的一部分)。 可以
所以我有一个桌面应用程序,使用 OpenGL 以 3D 方式渲染大型数据集。我想将其移动到云端并使用服务器端渲染,以便将渲染的图像流式传输到远程客户端(JS等......
CMake 找不到随 homebrew 安装的 freetype2
错误: -- 检测CXX编译特性 -- 检测 CXX 编译功能 - 完成 -- 执行测试 CMAKE_HAVE_LIBC_PTHREAD -- 执行测试 CMAKE_HAVE_LIBC_PTHREAD - 成功 -- 找到的主题: