OpenGL на Fedora 15
Я пытаюсь программировать в OpenGL.
так написал тестовый вызов программы t_gl1.cpp
Я построил это успешно с
$ g++ t_gl1.cpp -lglut -lGL -lGLU -o t_gl1
Никаких ошибок.
Однако, если я попытаюсь запустить его, я получил
freeglut (./t_gl1): ОШИБКА: внутренняя ошибка в функции fgOpenWindow X Ошибка неудавшегося запроса: BadWindow (недопустимый параметр Window) Главный код операции неудавшегося запроса: 4 (X_DestroyWindow) Идентификатор ресурса в неудавшемся запросе: 0x0 Серийный номер неудавшегося запроса: 26 Текущий серийный номер в выходном потоке: 29
Кто-нибудь знает что происходит?
Вот код, протестированный на Windows и Mac, без проблем. Но не могу запустить его ни на Fedora, ни на Ubuntu
#include <iostream>
#include <stdlib.h>
#ifdef __APPLE__
#include <OpenGL/OpenGL.h>
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif
using namespace std;
//Called when a key is pressed
void handleKeypress(unsigned char key, //The key that was pressed
int x, int y) { //The current mouse coordinates
switch (key) {
case 27: //Escape key
exit(0); //Exit the program
}
}
//Initializes 3D rendering
void initRendering() {
//Makes 3D drawing work when something is in front of something else
glEnable(GL_DEPTH_TEST);
glEnable(GL_COLOR_MATERIAL); //NEW OF THIS
glClearColor(0.7f,0.9f,1.0f,1.0f); //background, last number to be 1.0f
}
//Called when the window is resized
void handleResize(int w, int h) {
//Tell OpenGL how to convert from coordinates to pixel values
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION); //Switch to setting the camera perspective
//Set the camera perspective
glLoadIdentity(); //Reset the camera
gluPerspective(45.0, //The camera angle
(double)w / (double)h, //The width-to-height ratio
1.0, //The near z clipping coordinate
200.0); //The far z clipping coordinate
}
float _angle=30.0f; //kinda global variable
//Draws the 3D scene
void drawScene() {
//Clear information from last draw
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW); //Switch to the drawing perspective
glLoadIdentity(); //Reset the drawing perspective
glTranslatef(0.0f,0.0f,-5.0f);
glPushMatrix();
glRotatef(_angle, 0.0f, 1.0f , 0.0f);
glColor3f(0.5f,0.0f,0.8f);
glBegin(GL_QUADS); //Begin quadrilateral coordinates
//Trapezoid
glVertex3f(-0.7f, -1.5f, 0.0f);
glVertex3f(0.7f, -1.5f, 0.0f);
glVertex3f(0.4f, -0.5f, 0.0f);
glVertex3f(-0.4f, -0.5f, 0.0f);
glEnd(); //End quadrilateral coordinates
glPopMatrix();
glPushMatrix(); //push
glRotatef(_angle, 1.0f, 0.0f, 0.0f);
glBegin(GL_TRIANGLES); //Begin triangle coordinates Begin Pentagon
glColor3f(1.0f,0.0f,0.0f);
//Pentagon
glVertex3f(0.5f, 0.5f, -0.0f);
glVertex3f(1.5f, 0.5f, -0.0f);
glVertex3f(0.5f, 1.0f, -0.0f);
glVertex3f(0.5f, 1.0f, -0.0f);
glVertex3f(1.5f, 0.5f, -0.0f);
glVertex3f(1.5f, 1.0f, -0.0f);
glVertex3f(0.5f, 1.0f, -0.0f);
glVertex3f(1.5f, 1.0f, -0.0f);
glVertex3f(1.0f, 1.5f, -0.0f);
glEnd(); //end Pentagon
glPopMatrix(); //pop
glPushMatrix();
glRotatef(_angle, -1.0f, 1.0f, 0.0f);
glBegin(GL_TRIANGLES);
//Triangle
glVertex3f(-0.5f, 0.5f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-1.0f, 1.5f, -0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(-1.5f, 0.5f, -0.0f);
glEnd(); //End triangle coordinates
glPopMatrix();
glutSwapBuffers(); //Send the 3D scene to the screen
}
void update(int value)
{
_angle+=2.0f;
if(_angle>360)
_angle-=360;
glutPostRedisplay();
glutTimerFunc(25,update,0);
}
int main(int argc, char** argv) {
//Initialize GLUT
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(400, 400); //Set the window size
//Create the window
glutCreateWindow("window");
initRendering(); //Initialize rendering
//Set handler functions for drawing, keypresses, and window resizes
glutDisplayFunc(drawScene); //display the "drwwScene" most important part, others are settings
glutKeyboardFunc(handleKeypress);
glutReshapeFunc(handleResize);
glutTimerFunc(25,update,0); //add the timer function to make animation
glutMainLoop(); //Start the main loop. glutMainLoop doesn't return.
return 0; //This line is never reached
}
3 ответа
Я согласен с когтями. Это было из-за проблемы с Nvidia. Я не смог найти официальный способ установить драйвер разработчика Nvidia на Fedora 15. Поэтому я использовал rpmfusion. Драйвер работает, и я могу запустить CUDA. Только связанные с GLX вещи перепутаны. Тем не менее, это также испортило Gnome 3.
Поэтому я перешел на Arch Linux. Начав с чистого листа, установите Nvida и установите Xorg в соответствии с ArchWiki. А затем установите Gnome. Удивительно, но OpenGL работает. Я думаю, что драйвер в Arch Repo не является драйвером разработчика. Может быть, просто для отображения драйвера. Тем не менее, CUDA работает.
Я рад этому. И, надеюсь, это будет полезно для кого-то еще, кто хочет запустить CUDA и OpenGL в Linux.
Спасибо альфред
В коде нет ничего плохого. Я могу успешно скомпилировать и запустить его в правильно настроенной 64-битной системе Linux с драйверами NVIDIA выпуска 280.13. У вас проблема с установкой или настройкой драйвера или драйвера X11. Для этого вопроса не требуется помощь в программировании.
Поскольку вы отметили этот вопрос cuda
Я предполагаю, что вы используете аппаратное обеспечение NVidia.
Попробуйте установить несколько драйверов.