OpenGL-Intel 630 GPU -Ubuntu 16.04无法呈现简单的三角形

时间:2017-09-13 18:18:13

标签: opengl ubuntu-16.04 intel mesa

我编写了一个简单的openGL代码来渲染一个三角形,它已成功编译但无法渲染三角形。只创建一个窗口,glGetError() api调用没有错误返回。相同的代码在AMD R9 GPU上运行良好。驱动程序安装也是正确的,因为我能够运行像glxgears或glxhead这样的glxdemos而没有任何错误。 请帮助我找出这个问题的根本原因。

这是我的系统配置。 CPU - intel i5 7400(Kaby Lake 630 HD GPU) 操作系统 - Ubuntu 16.04 64位 MESA - 3.0 v17.03

这是我渲染三角形的代码。

#include <stdio.h>
#include <stdlib.h>
#include <GL/glew.h>
#include <GLFW/glfw3.h>

int main(int agrc, char **argv)
{
    //do windowing related stuff here

    if ( !glfwInit())
    {
            printf("Error: Failed to initialize GLFW\n");
            return -1;
    }

    GLFWwindow* window = glfwCreateWindow(800, 600, "Triangle", NULL, NULL);
    if (window == NULL)
    {
            printf("Failed to create GLFW window\n");
            glfwTerminate();
            return -1;
    }
    glfwMakeContextCurrent(window);

    glewExperimental = GL_TRUE;
    if (glewInit() != GLEW_OK)
    {
            printf("Error: Failed to initialize GLEW\n");
            return -1;
    }

    //declare vertices
    GLfloat verts[] =
    {
            +0.0f, +0.5f, +0.0f,
            -0.5f, -0.5f, +0.0f,
            +0.5f, -0.5f, +0.0f,
    };

    //VBO related activity
    //declare VAO, VBO 
    GLuint VAO, VBO, EBO;

    //get unique name/ID
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);
    //glGenBuffers(1, &EBO);

    // Bind VAO first, then bind and set VBOs and then configure vertex attributes
    //bind VAO
    glBindVertexArray(VAO);

    //bind VBO
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    //copy data to GPU
    glBufferData(GL_ARRAY_BUFFER, sizeof(verts), verts, GL_STATIC_DRAW);
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindVertexArray(0);

    glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    glfwSwapBuffers(window);

    do{
            glfwPollEvents();
    }while(glfwGetKey(window, GLFW_KEY_ESCAPE ) != GLFW_PRESS && glfwWindowShouldClose(window) == 0);
    return 0;

}

1 个答案:

答案 0 :(得分:0)

我不知道这是否是您问题的解决方案,至少这里有一些建议:

你只需要在glew&amp;之后渲染三角形(通过调用glfwPollEvents)。其他gl设置。这不好,因为只要有变化,你的画面就会丢失。 &#34;主要变化&#34;窗口大小和位置。

Ubuntu(Xorg或Wayland)中的窗口管理器是异步的。这意味着你应该等到窗口可用(&#34;实现&#34;用Xorg说法)。处理此事件的一种方法是轮询事件,因为通常会实现窗口,然后给出大小和位置,这些操作会触发事件。

所以代码的第一件事就是你应该在你调用glViewport的循环中移动渲染代码。

其他问题是你没有设置视口的大小(要在窗口内绘制的矩形,可能是整个窗口)。 OpenGL使用适合窗口的默认视口。但是你改变了需要再次调用 from selenium import webdriver browser=webdriver.Chrome() browser.maximize_window() browser.get('https://www.gmail.com') email=browser.find_element_by_xpath('//*[@id="identifierId"]') email.send_keys('my email-id') next=browser.find_element_by_xpath('//*[@id="identifierNext"]/content/span') next.click() passwd=browser.find_element_by_name("password") passwd.send_keys('mypassword') next1=browser.find_element_by_xpath('//*[@id="passwordNext"]/content/span') next1.click() 的窗口大小。结论:做一个&#34;回调&#34;用于更改视口的glfw size-event。

此外,您不能使用着色器。好吧,也许对于你的第一个测试应用程序,你可以避免它们(OpenGL有默认着色器)。但我强烈建议立即开始使用它们,即使是第一次使它们有点困难。他们是必须的。

最后,按照使用OpenGL&gt; = 3.2的好教程进行操作。列举两个:https://learnopengl.com/Learning Modern 3D Graphics Programming