OpenGL(开放图形库)是一种独立于平台的图形标准和API,可用于桌面,工作站和移动设备。它旨在提供硬件加速渲染,因此与传统软件渲染相比,性能大大提高。 OpenGL用于CAD软件和计算机游戏等应用程序。 OpenGL标准以及OpenGL ES由Khronos集团控制。
我希望通过管道传输 2 个几何着色器。第一个获取一个点并释放多个点。第二个获取这些点之一并向片段着色器释放一个矩形。 几何着色器 1:
我使用 glFrustum 编写了一个简单的程序。三角形的所有点都在范围内,但它没有出现。 glewInit(); sf::Window 窗口(sf::VideoMode(800, 800), "OpenGL", sf::Style::
我使用 glFrustum 编写了一个简单的程序。对象的所有点都在范围内,但对象没有出现。 glewInit(); sf::Window 窗口(sf::VideoMode(800, 800), "OpenGL", sf::
我使用glFrustum编写了一个简单的程序,关于对象的所有点都在范围内。但没有显示任何内容。 glewInit(); sf::Window 窗口(sf::VideoMode(800, 800), "OpenGL", sf::S...
为什么glBindBuffer的第二个参数是unsigned int?
据我所知,我首先需要通过调用glGenBuffers来生成一个缓冲区的名称,它会为开发人员手动命名的特定对象(数组)分配一些RAM。这就是为什么我需要写...
我正在尝试找到一种可靠的方法来准确设置我的 OpenGL 应用程序应渲染到屏幕上的 FPS。在某种程度上,我可以通过睡眠 1000/fps 毫秒来做到这一点,但那
在OpenGL中,我们在一个永恒的循环中绘制图形,例如while(!glfwWindowShouldClose(window))(除非发生退出事件,否则将条件设置为 false)。 据说在这个渲染循环中我们需要...
每个Mesh都有一个Transform对象,Transform是一个描述它们的位置、旋转和缩放的类,它还计算前向向量(局部Z轴)、向右和向上向量。
GLSL 有许多预定义的全局变量,例如 gl_LightSource。它们是全局的,因为任何着色器都可以访问它们。 如何在 GLSL 中定义自定义全局变量?
Playground.exe 中的 0x69F1454A (nvoglv32.dll) 抛出异常:0xC0000005:读取位置 0x0A08D000 时发生访问冲突
我想显示纹理,但编译器(Visual Studio 2017)给了我这个错误: Playground.exe 中的 0x69F1454A (nvoglv32.dll) 处抛出异常:0xC0000005:读取位置访问冲突
OPENGL 中纹理的 SDL_PIXELFORMAT_ABGR1555 的等效像素格式是什么?
我有一个游戏,将 ABGR1555 类型的颜色值输出到帧缓冲区,到目前为止我一直在使用 SDL2 进行图形(绘制纹理),并且它可以方便地选择处理颜色
我尝试在 64 位 Windows 8 上使用 netbeans 和 cygwin 4.8.1 使用本教程。 但是,我遇到了很多错误,例如这个, /usr/include/w32api/GL/glu.h:68:79:错误:在“*”之前预期有“)”...
无法为某些基于 pyproject.toml 的项目构建可安装的轮子(PyOpenGL_accelerate) 当我尝试使用以下命令下载 PyOpenGL for Python 3.12.2 时: pip 安装 PyOpenGL PyOpenGL_accelerate PyO...
我在Ubuntu 11.04上编写了一个使用freeglut的程序。效果很好。然后我又买了一台电脑,尝试在全新安装的 Ubuntu 11.04 上运行该程序。不起作用。所以我安装了 须藤...
glfwGetWindowSize 和 glfwGetFramebufferSize 有什么区别?
我正在学习OpenGL并且正在使用GLFW库。我试图理解文档中屏幕坐标和窗口帧缓冲区的含义。因此,我记录了宽度和高度
我目前需要一个在Python中每秒运行128次的函数。这是我的代码 导入时间、线程 运行计数器 = 0 def 跑步者(): 全局运行计数器 而真实: 做一些事...
我一直在尝试安装GLFW和GLFW3,使用终端来安装 sudo apt-get install GLFW 须藤 apt-get 安装 GLFW3 每当我这样做时,我都会得到如下结果 正在阅读包裹清单...完成
我在Ubuntu 11.04上编写了一个使用freeglut的程序。效果很好。然后我又买了一台电脑,尝试在全新安装的 Ubuntu 11.04 上运行该程序。不起作用。所以我安装了 须藤...
我试图通过 glReadPixels() 获取在 OpenGL 中单击的颜色: #包括 #包括 #包括 #包括 我正在尝试通过 glReadPixels() 获取在 OpenGL 中单击的颜色: #include <iostream> #include <glad/glad.h> #include <GLFW/glfw3.h> #include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/type_ptr.hpp> const char *vertexShaderSource = "#version 330 core\n" "layout (location = 0) in vec4 aPos;\n" "uniform mat4 projection;\n" "uniform mat4 model;\n" "void main()\n" "{\n" " gl_Position = projection * model * vec4(aPos.xy, 0.0, 1.0);\n" "}\0"; const char *fragmentShaderSource = "#version 330 core\n" "out vec4 FragColor;\n" "void main()\n" "{\n" " FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0"; int main() { if (glfwInit()) { glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); } else { std::cout << "glfw failed to initialise" << std::endl; } GLFWwindow *window = glfwCreateWindow(500, 500, "Opengl Selection", NULL, NULL); glfwMakeContextCurrent(window); if (!gladLoadGLLoader((GLADloadproc) glfwGetProcAddress)) { std::cout << "Failed to initialise glad" << std::endl; } glClearColor(0.3f, 0.2f, 0.1f, 1.0f); glViewport(0, 0, 500, 500); unsigned int vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vertexShaderSource, NULL); glCompileShader(vertexShader); int success; char 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; } unsigned int fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL); glCompileShader(fragmentShader); glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } unsigned int shaderProgram = glCreateProgram(); glAttachShader(shaderProgram, vertexShader); glAttachShader(shaderProgram, fragmentShader); glLinkProgram(shaderProgram); 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 vertices[] = { // pos // tex 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f }; unsigned int VBO, VAO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); glBindVertexArray(VAO); glEnableVertexAttribArray(0); glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void *) 0); glBindBuffer(GL_ARRAY_BUFFER, 0); glBindVertexArray(0); glUseProgram(shaderProgram); glm::mat4 projection = glm::ortho(0.0f, 1000.0f, 1000.0f, 0.0f, -1.0f, 1.0f); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "projection"), 1, GL_FALSE, glm::value_ptr(projection)); while (!glfwWindowShouldClose(window)) { glfwPollEvents(); glClear(GL_COLOR_BUFFER_BIT); glUseProgram(shaderProgram); // glm::mat4 projection = glm::ortho(0.0f, 500.0f, 500.0f, 0.0f, -1.0f, 1.0f); glm::mat4 model = glm::mat4(1.0f); model = glm::translate(model, glm::vec3(0.0f, 0.0f, 0.0f)); model = glm::scale(model, glm::vec3(100.0f, 100.0f, 0.0f)); glUniformMatrix4fv(glGetUniformLocation(shaderProgram, "model"), 1, GL_FALSE, glm::value_ptr(model)); glBindVertexArray(VAO); glDrawArrays(GL_TRIANGLES, 0, 6); glBindVertexArray(0); glfwSetMouseButtonCallback(window, [](GLFWwindow *window, int button, int action, int mods) { if (action == GLFW_PRESS) { double xPos, yPos; glfwGetCursorPos(window, &xPos, &yPos); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); unsigned char data[4]; glReadPixels(xPos, yPos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); std::cout << (float) data[0] << " " << (float) data[1] << " " << (float) data[2] << " " << (float) data[ 3] << std::endl; } }); glfwSwapBuffers(window); glfwPollEvents(); } return 0; } 但是,无论我点击哪里,OpenGl 都会返回背景颜色。我相信我在如何在屏幕上渲染正方形方面做错了。 问题*是传递给 glfwGetCursorPos 的位置是相对于窗口的 upper-左上角,而传递给 glReadPixels 的位置是相对于窗口的 lower-左角窗户。 解决方案是将调用的 y 位置反转为 glReadPixels。 500x500 窗口中位置的值范围为 0 到 499,因此必须从 499 中减去 yPos: glReadPixels(xPos, 499 - yPos, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, data); 现在,当 xPos 和 yPos < 50. 都返回正方形的颜色 *正如Rabbid76在评论中首先指出的那样。
我正在尝试渲染一个具有木质纹理的立方体(立方体的所有面都具有相同的纹理),但纹理没有按应有的方式渲染(看起来纹理在某些部分是透明的......