2017-04-10 2 views
0

Ich versuche, ein Projekt unter Mac OS X, das unter Windows funktioniert. Das Projekt verwendet die OpenGL- und PyQt-Bibliotheken. Es scheint ein Problem mit der Verwendung der OpenGL-Bibliothek zu geben.OpenGL: PyCharm unerwartet beendet auf Mac

Ich habe eine OpenGL-Demo einer Helix heruntergeladen, die funktioniert.

print("OpenGL: " + str(glGetString(GL_VERSION))) 

kehrt OpenGL: b'2.1 NVIDIA-10.0.51 310.90.10.05b12'

Wenn ich versuche, das andere Projekt auszuführen, beendet PyCharm unerwartet und ich folgendes:

Traceback (most recent call last): 
    File "/CS 410/Agile-Development-Project-master2/package/ui/widgets/gamewidget.py", line 177, in initializeGL 
    glPrimitiveRestartIndex(self.restart) 
    File "/anaconda/lib/python3.5/site-packages/OpenGL/platform/baseplatform.py", line 402, in __call__ 
    return self(*args, **named) 
    File "errorchecker.pyx", line 53, in OpenGL_accelerate.errorchecker._ErrorChecker.glCheckError (src/errorchecker.c:1218) 
OpenGL.error.GLError: GLError(
    err = 1282, 
    description = b'invalid operation', 
    baseOperation = glPrimitiveRestartIndex, 
    cArguments = (4294967295,) 
) 

Picture of Mac Info

Project Link

mainwi ndow.py

from PyQt5 import QtOpenGL 
from PyQt5.QtWidgets import QMainWindow, QStackedWidget 
from package.ui.widgets import GameWidget 

class MainWindow(QMainWindow): 

    def __init__(self): 
     super().__init__() 

     glformat = QtOpenGL.QGLFormat() 
     glformat.setVersion(3, 1) 
     glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile) 

     self.setWindowTitle('Game name here') 
     #self.stacked_widget = QStackedWidget(GameWidget()) 
     self.setCentralWidget(GameWidget(glformat)) 

init in gamewidget.py

def __init__(self, *args, n=10, **kwargs): 

Einstellung Version 3.2: glGetString (GL_VERSION) gibt einen 3.3 Kontext

neue Fehler (Python beendet noch unerwartet) :

Traceback (most recent call last): 
    File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 183, in initializeGL 
    self.initializeCube() 
    File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 142, in initializeCube 
    program = self.loadShaders() 
    File "/Users/daniel/WSCU/Spring 2017/CS 410/Agile-Development-Project-mastercurrent/package/ui/widgets/gamewidget.py", line 227, in loadShaders 
    raise RuntimeError(glGetShaderInfoLog(fs)) 
RuntimeError: b"ERROR: 0:6: Use of undeclared identifier 'gl_FragColor'\n" 

EDIT:

def initializeTimer(self): 
    self.pbar = QProgressBar(self) 
    self.pbar.setGeometry(30, 40, 200, 25) 
    self.timer = QBasicTimer() 
    self.timer.start(1200, self) 
    self.step = 100 
    self.pbar.setValue(self.step) 
    self.btn = QPushButton("Time is: " + str(int(self.step * 1.2)), self) 
    self.btn.setStyleSheet("background-color: black; color: red;") 
    self.btn.move(500, 10) 
    self.show() 


def timerEvent(self, e): 
    if self.step <= 0: 
     self.timer.stop() 
     return 
    self.step -= 1 
    self.score += 1 
    # print(self.score) 
    self.btn.setText("Time is: " + str(int(self.step * 1.2))) 
    self.scoreLabel.setText("Score: " + str(int(self.score))) 
    self.pbar.setValue(self.step) 
    self.pbar.setVisible(True) 
    print(self.btn.text()) 
    print(self.pbar.text()) 


def makeScoreLabel(self): 
    self.scoreLabel = QPushButton("Score: " + str(int(self.score)), self) 
    self.scoreLabel.setStyleSheet("background-color: white; color: red;") 
    self.scoreLabel.move(200, 10) 

Antwort

2

Sie verwenden einen 2.1 Kontext und glPrimitiveRestartIndex() ist eine 3.1 (Kern) Funktion.

Um einen 3.1-Kontext anzufordern, erstellen Sie QGLFormat() und geben Sie die Version an.

glformat = QtOpenGL.QGLFormat() 
glformat.setVersion(3, 1) 
glformat.setProfile(QtOpenGL.QGLFormat.CoreProfile) 

gibt es dann auf Ihre GLWidget, wie Sie es QGLWidget(glformat) erstellen.


Also in Bezug auf Ihr Projekt. Da GameWidget erweitert QGLWidget bedeutet, dass Sie glformat zu GameWidget in mainwindow.py übergeben sollten.

self.setCentralWidget(GameWidget(glformat)) 

Hinweis Ihre __init__ in GameWidget. Da n vor *args kommt bedeutet, dass b landet format sein, so müssen Sie es wie folgt neu zu ordnen:

def __init__(self, *args, n=10, **kwargs) 

jetzt Ihr Problem tatsächlich Ihr Fragment-Shader ist.

0 (5): error C7533: globale Variable gl_FragColor nach Version veraltet 120

Sie setzen Ihre Version 330 bedeutet dies, dass gl_FragColor veraltet. Stattdessen müssen Sie Ihre eigene Farbausgabe angeben.

#version 330 

out vec4 outColor; 

in vec3 fcolor; 

void main() 
{ 
    outColor = vec4(fcolor, 1.0); 
} 

Sie müssen noch glformat-QGLWidget passieren.


Edit:

Wenn Sie sagen, eine Beschriftung hinzufügen möchten, dann statt dessen:

self.widget = GameWidget() 
self.setCentralWidget(self.widget) 

Dann Sie dies tun müssen:

from PyQt5.QtWidgets import QWidget, QVBoxLayout, QLabel 

self.label = QLabel() 
self.label.setText("Hello World") 

self.layout = QVBoxLayout() 
self.layout.addWidget(self.label) 

self.widget = QWidget() 
self.widget.setLayout(self.layout) 

self.setCentralWidget(self.widget) 

Das Problem damit ist natürlich, dass wir jetzt eine haben neu QWidget und nicht die GameWidget (QGLWidget). Das Problem hier ist, dass Sie nicht einfach andere Widgets zu einem QGLWidget hinzufügen können. Das ist der Grund, warum in Bezug auf OpenGL Benutzer normalerweise benutzerdefinierte GUI oder ein separates Fenster für alle Kontrollen, Etiketten und was nicht.

+0

Ich bin verwirrt, wo man das hinstellt. Ich habe oben einen Link zu dem Projekt hinzugefügt, an dem ich gerade arbeite. Ich habe versucht, es Hauptwindow.py und fügen Sie es dem GameWidget() in der letzten Zeile, Zeile 11, aber ich hatte kein Glück. Ist das der falsche Ort? – hungryHippo

+0

Werfen Sie einen Blick auf meine Bearbeitung. – Vallentin

+0

Ich habe Ihren Code hinzugefügt, bekomme aber immer noch den gleichen genauen Fehler. Siehe meine Bearbeitung für die Änderungen, die ich vorgenommen habe. Habe ich Glformat an der falschen Stelle gemacht? – hungryHippo

Verwandte Themen