Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Ja, weil die Farbe ja erst vom Fragmentshader festgelegt wird.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Shader sind Programme, die du in GLSL programmieren musst. Du musst OpenGL den Shader-Quellcode übergeben, ihn kompilieren und linken. Wie das geht, ist im Tutorial glsl erklärt (bitte auch lesen!). Die Funktion glCreateShader ist auch beteiligt, aber nur ein Shader-Objekt zu erzeugen, ohne etwas damit zu machen, reicht natürlich nicht.
Sinnvollerweise lädt man den Shadercode aus einer Textdatei. Dies tut vermutlich die Funktion "LoadShaders", die du neulich schon angesprochen hast.
Hier ist mal ein Minimal-Beispiel, wie GLSL-Shader aussehen können: (Vertexshader)
Code:
#version 330
// Input vom VBO:
invec3 inPos;
invec4 inColor;
// Ausgabe an den Fragmentshader:
outvec4 Color;
void main(void)
{
gl_Position=vec4(inPos,1.0);
Color = inColor;
}
(Fragmentshader)
Code:
#version 330
invec4 Color;// interpolierte Farbe vom Vertexshader
outvec4 outColor;// ausgegebene Farbe
void main(void)
{
outColor = Color;
}
Der Code ist nicht getestet, aufgrund der Trivialität glaube ich aber nicht, dass sich dort ein Fehler eingeschlichen hat. Aber OpenGL wird dir schon sagen, wenn sich der Code nicht kompilieren oder linken lässt. Nachdem du das Tutorial gelesen hast, möchte ich nochmal auf die Punkte hinweisen, die sich seit dem Tutorial an GLSL geändert haben.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Jetzt kommt ein farbiges Dreieck, welches das ganze Fenster ausfüllt und sich nicht mehr dreht .
Erst wen ich diesen Befehl glUseProgram(programID); entferne, dann kommen wieder 2 Dreiecke, welche kleiner sind, aber dafür sind sie wieder weiss. Warscheinlich liegt das daran, das ich noch alte Befehle im Programm habe.
Die Fehlerauswertung, des Shader funktioniert auch nicht richtig, InfoLogLength ist 11 anstelle 0 und es kommt No error.. Dies ist jetzt nicht so wichtig.
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
glGetShaderiv mit dem Parameter GL_INFO_LOG_LENGTH gibt nunmal keinen Fehlercode aus, sondern die Länge des InfoLogs. Dort darf auch was drin stehen, wenn es keinen Fehler zu melden gibt. Eben sowas wie "No errors.", was 11 Zeichen sind, wenn man das abschließende '\0' mitzählt. Oder auch Warnungen.
Wenn du möchtest, dass sich die Dreiecke drehen, musst du den Vertexshader so programmieren, dass er die Vertices entsprechend rotiert. Zum Beispiel kannst du alle Vertices mit einer Matrix transformieren, wie es auch die Fixed-Function-Pipeline tut. Beispiel:
Code:
#version 330
uniformmat4 u_Matrix;
// Input vom VBO:
invec3 inPos;
invec4 inColor;
// Ausgabe an den Fragmentshader:
outvec4 Color;
void main(void)
{
gl_Position= u_Matrix *vec4(inPos,1.0);
Color = inColor;
}
Die Werte der Matrix musst du dann auf der CPU berechnen und per glUniformMatrix4fv an den Shader übergeben (während dieser gebunden ist). Wie man eine entsprechende Rotationsmatrix berechnet, steht im Wiki-Artikel zu glRotate. Genau so ist es mit den Matrizen für das Viewfrustum usw. Wer das nicht alles per Hand implementieren will, kann auch auf fremde Mathe-Libraries zurückgreifen (für Pascal kenne ich allerdings keine).
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Es ist nirgens garantiert, dass der InfoLog der Länge 0 ist, wenn kein Fehler auftritt. Du müsstest den Compilestatus mit "GL_COMPILE_STATUS" abfragen. Wenn der Shader erfolgreich kompiliert wurde, wird "GL_TRUE" zurückgegeben, sonst "GL_FALSE". Wegen teilweise sinnvollen Warnungen, würde ich den Log allerdings erstmal nicht verstecken.
Ich würde dir außerdem empfehlen, nochmal eine solche Fehlerprüfung nach dem Linken durchzuführen. Auch da kann einiges schiefgehen. Zum Beispiel wenn der Output vom Vertexshader nicht zu dem Input des Fragmentshader passt. Das geht dann ganz analog zu der bereits existierenden Prüfung mit "glGetProgramiv" und dem Parametern "GL_INFO_LOG_LENGTH" für die Log-Länge sowie "GL_LINK_STATUS" um herauszufinden, ob das linken überhaupt geklappt hat. Den Text des Infologs selber bekommt man mit "glGetProgramInfoLog" ebenfalls genauso wie schon beim Shader.
Die Fehlerabfrage selbst würde funktionieren, nun habe ich ein Problem mit PChar/PGLChar. Anstelles der Fehlerbeschreiben kommt ein vermüllter String raus. Die Zeilen mit Write(str), für die Shaderquelltextausgabe gibt es nicht mehr. Ich habe bewusst einen Syntaxfehler in die Shader-Datei eingebaut.
Diese Zeile ist fehlerhaft. Du kannst vom (Fragment)ShaderObject keinen Linker-Status abfragen. Wenn du wissen möchtest, ob ein Programm erfolgreich gelinkt wurde, muss du das ProgramObject danach fragen. Dann aber nicht mit glGetShaderiv, sondern mit glGetProgramiv.
Linker-Fehlermeldungen in Textform bekommst du analog mit glGetProgramInfoLog.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
Registriert: Mi Aug 14, 2013 21:17 Beiträge: 588
Programmiersprache: C++
Wenn du dir die Fehlermeldungen mit glGetShaderInfoLog oder glGetProgramInfoLog abholst, musst du den Funktionen auch Speicherplatz bereitstellen, in den sie ihre Meldungen schreiben können. Momentan übergibst du nur einen Pointer ins Nichts (PC). Stattdessen solltest du PC auf einen Speicherblock zeigen lassen, der so groß ist wie InfoLogLength. Und am Ende nicht vergessen, den Speicherplatz wieder freizugeben!
Wie das in Pascal genau geht, kann ich dir leider nicht aus dem Kopf sagen.
_________________ So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Danke, hat geklappt, ich habe noch PC durch PChar(Msg) in der Zeile ...MessageBox(PC,... ersetzt.
Was ich unterdessen festgestellt habe, das man durch das neue OpenGL fast keine Untersützung mehr hat, z.B. glRotate und glTranslate. Ich musste da selbst was schreiben.
Was mit aufgefallen ist, mit dem alten OpenGL konnte man wild losprogrammieren. Da hatte es noch keine Shader, VBOs, etc. Der Einstieg war dadurch viel einfacher, man konnte glBegin, ein paar Vertexpunkte, glEnd eingeben und schon hatte man ein Polygon. Das neue OpenGL hat natürlich auch viele Vorteil, es ist sehr flexibel und natürlich auch schneller, da man nur noch die Vertex-Punkte übergeben muss. Wen ich mir diesen alten Programm Ausschnitt angucke, das kann ja nicht schnell sein. Bei jedem Rendern wurde neu berechnet.
Code:
procedure Stutzen(h1, h2, r :Single; Sektoren :Integer);
var
i :Integer;
h, c1, c2 :Single;
begin
for i :=0to Sektoren -1dobegin
if i > 17thenbegin
c1 :=36- i;
c2 :=36- i -1;
endelsebegin
c1 := i;
c2 := i +1;
end;
c1 :=1- c1 /35-0.3;
c2 :=1- c2 /35-0.3;
glBegin(GL_QUADS);
glColor3f(c1, c1, c1);
h :=Sqrt(Sqr(h2)-Sqr(KreisTab[i].x* r));
with KreisTab[i]do glVertex3f(x * r, h1, y * r);
with KreisTab[i]do glVertex3f(x * r, h, y * r);
glColor3f(c2, c2, c2);
h :=Sqrt(Sqr(h2)-Sqr(KreisTab[i +1].x* r));
with KreisTab[i +1]do glVertex3f(x * r, h, y * r);
with KreisTab[i +1]do glVertex3f(x * r, h1, y * r);
glEnd;
end;
end;
Zu den Shadern, ich mag mich erinnern, als die ersten Grafikkarten auf dem Märt kahmen, bei denen man den Shader frei programmieren konnte. Da dachte man dies brauchen nur profesionelle Spieleprogrammierer und jetzt wendet man dies selbst an.
Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.