OpenGL英特尔630 GPU-Ubuntu 16.04无法渲染简单三角形

OpenGL英特尔630 GPU-Ubuntu 16.04无法渲染简单三角形,opengl,rendering,ubuntu-16.04,intel,mesa,Opengl,Rendering,Ubuntu 16.04,Intel,Mesa,我已经编写了一个简单的openGL代码来渲染三角形,它编译成功,但未能渲染三角形。仅创建这样的窗口,glGetError()api调用不会返回错误。同样的代码在AMDR9GPU上运行良好。驱动程序的安装也是正确的,因为我能够运行glxdemos,比如glxgears或glxhead,没有任何错误。 请帮我找出这个问题的根本原因 这是我的系统配置。 CPU-英特尔i5 7400(卡比湖630高清GPU) 操作系统-Ubuntu 16.04 64位 MESA-3.0 v17.03 这是我渲染三角形的

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

这是我的系统配置。 CPU-英特尔i5 7400(卡比湖630高清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;

}
#包括
#包括
#包括
#包括
int main(int agrc,字符**argv)
{
//在这里做窗口相关的事情
如果(!glfwInit())
{
printf(“错误:未能初始化GLFW\n”);
返回-1;
}
GLFWwindow*window=glfwCreateWindow(800600,“三角形”,NULL,NULL);
如果(窗口==NULL)
{
printf(“未能创建GLFW窗口\n”);
glfwTerminate();
返回-1;
}
glfwMakeContextCurrent(窗口);
glewExperimental=GL_TRUE;
如果(glewInit()!=GLEW\u确定)
{
printf(“错误:未能初始化GLEW\n”);
返回-1;
}
//声明顶点
GLfloat verts[]=
{
+0.0f、+0.5f、+0.0f、,
-0.5f、-0.5f、+0.0f、,
+0.5f、-0.5f、+0.0f、,
};
//与VBO有关的活动
//宣布VAO、VBO
GLuint VAO、VBO、EBO;
//获取唯一的名称/ID
glGenVertexArrays(1和VAO);
glGenBuffers(1,&VBO);
//glGenBuffers(1和EBO);
//首先绑定VAO,然后绑定并设置VBO,然后配置顶点属性
//绑定VAO
glBindVertexArray(VAO);
//绑定VBO
glBindBuffer(GL_数组_BUFFER,VBO);
//将数据复制到GPU
glBufferData(GLU数组缓冲区、大小(顶点)、顶点、GLU静态绘制);
glvertexattributepointer(0,3,GL_FLOAT,GL_FALSE,0,(void*)0);
GlenableVertexAttributeArray(0);
glBindBuffer(GL_数组_BUFFER,0);
glBindVertexArray(0);
glClearColor(0.2f、0.3f、0.3f、1.0f);
glClear(GLU颜色缓冲位);
glBindVertexArray(VAO);
gldrawArray(GL_三角形,0,3);
glfwSwapBuffers(窗口);
做{
glfwPollEvents();
}while(glfwGetKey(窗口,GLFW_键_退出)!=GLFW_按和GLFWWindowsShouldClose(窗口)==0);
返回0;
}

我不知道这是否能解决您的问题,至少这里有一些建议: 仅在glew和其他gl设置之后渲染一次三角形(通过调用
glDrawArrays
)。这是不好的,因为一旦有什么改变,你的图片就会丢失。“某些变化”的主要原因是窗口的大小和位置

Ubuntu中的窗口管理器(Xorg或Wayland)是异步的。这意味着您应该等待窗口可用(用Xorg的说法是“实现”)。处理这种情况的一种方法是轮询事件,因为通常情况下,窗口是实现的,然后给定大小和位置,这些操作会触发事件

因此,代码的第一件事是,应该将渲染代码移动到调用
glfwPollEvents
的循环中

另一个问题是您没有设置视口的大小(要在窗口内绘制的矩形,可能是整个窗口)。OpenGL使用安装到窗口的默认视口。但是,如果您更改了需要再次调用
glViewport
的窗口的大小,则会出现这种情况。结论:对更改视口的glfw大小事件进行“回调”

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


最后,遵循一个使用OpenGL>=3.2的好教程,这里有很多。举两个例子:我不知道这是否能解决您的问题,至少这里有一些建议: 仅在glew和其他gl设置之后渲染一次三角形(通过调用
glDrawArrays
)。这是不好的,因为一旦有什么改变,你的图片就会丢失。“某些变化”的主要原因是窗口的大小和位置

Ubuntu中的窗口管理器(Xorg或Wayland)是异步的。这意味着您应该等待窗口可用(用Xorg的说法是“实现”)。处理这种情况的一种方法是轮询事件,因为通常情况下,窗口是实现的,然后给定大小和位置,这些操作会触发事件

因此,代码的第一件事是,应该将渲染代码移动到调用
glfwPollEvents
的循环中

另一个问题是您没有设置视口的大小(要在窗口内绘制的矩形,可能是整个窗口)。OpenGL使用安装到窗口的默认视口。但是,如果您更改了需要再次调用
glViewport
的窗口的大小,则会出现这种情况。结论:对更改视口的glfw大小事件进行“回调”

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


最后,遵循一个使用OpenGL>=3.2的好教程,这里有很多。举两个例子:

如果你用鼠标改变窗口的大小,它会画出什么东西,甚至只是背景色吗?@rabbi76在Ubuntu中,很多奇怪的事情都会发生:(比如OGL只有在一些动作后才会启动。我以前在Intel HD4000中见过它。一些驱动程序默认情况下会启用深度测试(违反opengl标准)。尝试显式禁用它。编辑:哦,我看到你在运行Mesa。你真勇敢,真是个赌徒;-)@Ripi2-如果尝试使用mo更改窗口大小,背景颜色更改会反射,但不会出现三角形