我编写了一个简单的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;
}
答案 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