OpenGL на Fedora 15 - PullRequest
       19

OpenGL на Fedora 15

0 голосов
/ 20 августа 2011

Я пытаюсь программировать в 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 ]

2 голосов
/ 21 августа 2011

Я согласился с когтями.Это было из-за проблемы с Nvidia.Я не смог найти официальный способ установить драйвер разработчика Nvidia на Fedora 15. Поэтому я использовал rpmfusion.Драйвер работает, и я могу запустить CUDA.Только связанные с GLX вещи перепутаны.Однако, это также испортило Gnome 3.

Так что я переключился на Arch Linux.Начав с чистого листа, установите Nvida и установите Xorg в соответствии с ArchWiki.А затем установите Gnome.Удивительно, но OpenGL работает.Я думаю, что драйвер в Arch Repo не является драйвером разработчика.Может быть, просто для отображения драйвера.Тем не менее, CUDA работает.

Я рад этому.И, надеюсь, это будет полезно для кого-то еще, кто хочет запустить CUDA и OpenGL в Linux.

Спасибо, Альфред

1 голос
/ 20 августа 2011

В коде нет ничего плохого.Я могу успешно скомпилировать и запустить его в правильно настроенной 64-битной системе Linux с драйверами NVIDIA выпуска 280.13.У вас проблема с установкой или настройкой драйвера или драйвера X11.Для этого вопроса не требуется помощь в программировании.

0 голосов
/ 20 августа 2011

Поскольку вы отметили этот вопрос cuda Я собираюсь предположить, что вы используете аппаратное обеспечение NVidia.

Попробуйте установить некоторые драйверы .

...