Gerne möchte ich in XProfan Shader einsetzen für grafische Effekte aber auch für mathematische Berechnungen, welche dann parallel auf tausenden Kernen der Grafikkarte ausgeführt werden können.
In C++ habe ich es hinbekommen, in XProfan versperrt sich eine Funktion aus mir unbekannten Gründen. Es ist üblich, dass ich OpenGL Funktionen, die nicht zum Basisumfang gehören per wglGetProcAddress verfügbar machen muss und diese dann mit call() ausführe. Ich denke nicht, dass wir hier ein 32/64 Bit Parameterproblem haben, dennoch stürzt der Aufruf immer ab, unter Verdacht immer der übergebene String bzw. die Adresse davon aber dort habe ich schon alles probiert... Ich bekomme glShaderSource nur ausgeführt, wenn ich ihm sage, dass er 0 Quelltexte verarbeiten soll (3. Parameter in Call, 2. der Funktion) oder absichtlich eine nicht existente Shader-ID übergebe (2. Parameter in Call, 1. der Funktion).
Es sollten eigentlich keine OpenGL spezifischen Probleme sein, sobald OpenGL initialisiert ist sollte es klappen - oder selbst bei einem Fehler nicht abstürzen. Der Absturz deutet darauf hin, dass etwas mit den Parametern oder der Stringverarbeitung nicht klappt.
WindowStyle 1+2+8+16
WindowTitle "shader"
Window 100,100 - 720,480 'kompatible Schreibweise
Declare shaderProgram&, vertexShader&, vertexShaderSource$,eof$
oGL("Init", %hWnd, 1,1,1,1)
'Shader Funktionsadressen
Declare glCreateShader&, glShaderSource&
glCreateShader& = oGL("wglGetProcAddress","glCreateShader")
glShaderSource& = oGL("wglGetProcAddress","glShaderSource")
If ( glCreateShader& = 0) | ( glShaderSource& = 0)
Print "Funktion nicht gefunden" : WaitKey : End
Else
Print "Alle Funktionen gefunden"
EndIf
eof$ = chr$(13) + chr$(10) 'ausgelagert, um andere Varianten testen zu können
vertexShaderSource$ = "#version 330 core"+eof$ \
+"layout (location = 0) in vec3 aPos;"+eof$ \
+"layout (location = 1) in vec2 aTexCoord;"+eof$ \
+"out vec2 TexCoords;"+eof$ \
+"out vec3 FragPos;"+eof$ \
+"void main() {"+eof$ \
+"gl_Position = vec4(aPos, 1.0);"+eof$ \
+"TexCoords = aTexCoord;"+eof$ \
+"FragPos = aPos;"+eof$ \
+"}"
vertexShader& = Call(glCreateShader&, $8B31) ' $8B31 = GL_VERTEX_SHADER der erste Shader bekommt normalerweise die ID 1, das passt
Print "Hier ist die Welt noch in Ordnung (Taste drücken für Absturz)"
WaitKey
call(glShaderSource&, vertexShader&, 1, Addr(vertexShaderSource$),0)
'void glShaderSource( GLuint shader,
' GLsizei count,
' const GLchar **string,
' const GLint *length);
'
'shader
'Specifies the handle of the shader object whose source code is to be replaced.
'
'count
'Specifies the number of elements in the string and length arrays.
'-> 1 ist hier ok!
'
'string
'Specifies an array of pointers to strings containing the source code to be loaded into the shader.
'alles probiert, Bereich maßlos überdimensioniert, Addr() vopn Stringvariable, mit zusätzlichen Nullbytes oder normal, Berich per String oder Char gefüllt, verschiedene Zeilenumbrüche
'
'length
'Specifies an array of string lengths.
'0 lässt automatisch ermitteln aber auch eine Angabe macht es nicht besser
Print "Das hier wird nicht erreicht"
WaitKey
oGL("Done")
End
Alles anzeigen