2017-03-25 3 views
-2

Ich lerne OpenGL und ich habe ein Problem.OpenGL: Pufferobjekte/Shader gehen aus dem Geltungsbereich

Ich weiß, dass der gesamte Speicher auf die GPU von OpenGL zugeteilt wird, so dass der technische Bereich kein Problem sein sollte? Allerdings, wenn ich versuche, dies zu tun:

int SetUpVertexShader(){ 
    glViewport(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT); 

    //BUILD AND COMPILE SHADER 
    //VERTEX SHADER 
    GLuint vertexShader; 
    vertexShader = glCreateShader(GL_VERTEX_SHADER); 
    //snip - code to compile shader, etc etc 
    } 


}; 

int SetUpFragmentShaderandLink(){ 
    //BUILD AND COMPILE SHADER 
    //FRAGMENT SHADER 
    GLint success; 
    GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
    //snip - code to compile shader, etc etc 

}; 

int linkShaders(){ 
    GLuint shaderProgram = glCreateProgram(); 
    glAttachShader(shaderProgram, vertexShader); //this line has complaints saying vertexShader is an undeclared identifier 
    glAttachShader(shaderProgram, fragmentShader); // this line also has complaints saying fragmentShader is an undeclared identifier 
    //the rest of the lines all have undeclared identifier complaints 
    glLinkProgram(shaderProgram); 
    //check linking errors 
    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success); 
    if(!success){ 
     glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog); 
     std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED" << infoLog << std::endl; 
    } 
}; 

dann, wenn ich auf die Verknüpfung von Shadern und Programmfunktion linkShaders bekommen, bekomme ich Beschwerden sagen, dass der Vertex-Shader und Fragment-Shader out of scope sind (genauer gesagt, ich sagte, dass diese beiden "nicht deklarierte Identifikatoren" sind). Wenn diese auf der GPU statt auf dem Stapel zugewiesen werden, warum wird mir dann gesagt, dass sie den Bereich verlassen? Mache ich etwas falsch?

+3

Dateien werden auf einem Datenträger zugewiesen, aber wenn Sie 'FILE * foo = fopen (" foo.txt "," w ")' angeben und versuchen, 'foo' außerhalb des Bereichs zu verwenden, wird ein Fehler ausgegeben. Erinnert es dich an etwas? –

+0

Bitte zeigen Sie die Deklarationen/Definitionen von 'vertexShader' und' fragmentShader', wie sie von 'linkShaders' verwendet werden (Hinweis: Die Definitionen, die Sie zeigen, sind lokal für' SetUpVertexShader' bzw. 'SetUpFragmentShaderandLink'). –

+0

@ n.m. Kannst du das weiter erklären? – kumikan

Antwort

-1

Das Problem ist nicht, dass der Speicher selbst außerhalb des Geltungsbereichs liegt, da der GPU-Speicher einem Heap-Muster folgt, während Variablen, die außerhalb des Geltungsbereichs liegen, nur in einem Stack-Muster vorkommen können.

Das Problem ist, dass der Zeiger auf diesen Speicher, der im CPU-Speicher gespeichert ist, auf dem Stapel liegt und den Gültigkeitsbereich verlässt. Sie müssen also Ihre GLuint Pointer einfach außerhalb des Funktionskörpers deklarieren.

+0

Was Sie dort geschrieben haben, ist sachlich ungenau und irreführend. Es ist verwirrender als hilfreich. Siehe oben den Kommentar von @ n.m. für einen Stupser in die richtige Richtung. – datenwolf

+0

@datenwolf Können Sie erklären, wo die Ungenauigkeit liegt? Es ist sicher richtig hart, und verlässt sich nicht auf völlig unabhängige Analogien wie der obige Kommentar, sondern gibt eigentlich die richtigen Namen für die Fragen für weitere Forschung und Verständnis, sowie eine umschriebene Lösung, anstatt zu fragen "erinnert sich das an dich von etwas?". Daher würde ich gerne wissen, warum dies einen Downvote verdient und warum Sie stattdessen keine bessere alternative Antwort geben. Tl; dr: Was ist das Problem genau? – xXliolauXx

+0

Erste Ungenauigkeit: Speicher hat keinen Gültigkeitsbereich. Symbole haben. Es gibt kein "Heap ** -Muster **" in der Speicherverwaltung. Bestimmte Betriebssysteme und/oder Laufzeitumgebungen definieren das Konzept des "Heap-Speichers" in einem Adressraum, aber das ist nur etwas, das genau definiert ist. Auch in C/C++ gibt es keinen "Heap". Es gibt * statischen * * automatischen * und * dynamischen * Speicher. Und zu guter Letzt, OpenGL Textur und Puffer Namen/IDs * sind __nicht __ * Zeiger, sie sind Griffe! Eine OpenGL-Textur oder -Puffer-ID verweist * not * überhaupt nicht auf einen bestimmten Speicherort. – datenwolf

0

Ihre Variablen müssen im Geltungsbereich sein, um sie zu verwenden (dies gilt unabhängig davon, ob OpenGL beteiligt ist oder nicht).

Was glCreateShader und glCreateProgram Rückkehr und glAttachShader und glLinkProgram Einsatz sind (eindeutige Kennungen für bestimmte Zwecke) behandelt, um OpenGL-Objekte. Stellen Sie sicher, dass Sie sie an einem Ort speichern, an dem Sie auf sie zugreifen können, wenn Sie sie anderen OpenGL-Aufrufen zur Verfügung stellen müssen (insbesondere zum Bereinigen von Funktionen, wenn Sie die ursprünglich angeforderten Ressourcen nicht mehr benötigen).

+0

Also bedeutet das, dass Dinge wie GLuint VertexShader Griffe sind? – kumikan

+0

Ja, 'vertexShader' ist ein _handle_ zu einem Objekt, das intern von OpenGL behandelt wird und kann über OpenGL-Aufrufe manipuliert werden, wo es geliefert wird. – Darklighter

Verwandte Themen