OpenGL英特尔630 GPU-Ubuntu 16.04无法渲染简单三角形
我已经编写了一个简单的openGL代码来渲染三角形,它编译成功,但未能渲染三角形。仅创建这样的窗口,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 这是我渲染三角形的
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更改窗口大小,背景颜色更改会反射,但不会出现三角形