DGL https://delphigl.com/forum/ |
|
glShaderSource verursacht AccessViolation https://delphigl.com/forum/viewtopic.php?f=20&t=9124 |
Seite 1 von 1 |
Autor: | sharkman [ Mi Mär 31, 2010 12:14 ] |
Betreff des Beitrags: | glShaderSource verursacht AccessViolation |
Ich hab mal versucht, den Phong per Pixel 2 shader aus dem Wiki in meiner Anwendung zum Laufen zu bringen. Aber alles, was ich sehe, ist ne AccessViolation in der atioglxx.dll. Weiß irgendwer, woran das liegen könnte? Ich hab ne Radeon HD 4650, falls das irgendwie wichtig ist, und ich benutze Delphi7. Die shader hab ich aus dem Wiki in ne .txt kopiert Code: FProgram: GLHandleARB; FVert: GLHandleARB; FFrag: GLHandleARB; Code: var i1: Integer; code, code1: string; LCode: TextFile; Code: FProgram:= glCreateProgramObjectARB();
FVert:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); FFrag:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); code:= ''; AssignFile(LCode, ExtractFilePath(Application.ExeName) + 'Ressources\Shaders\PhongPerPixel_Vert.txt'); Reset(LCode); while not seekEoF(LCode) do begin readln(LCode, code1); code:= code + code1; end; CloseFile(LCode); i1:= Length(code); glShaderSource(FVert, 1, @code[1], @i1); //Hier die AccessViolation bei 6983285A, lesen von 79726176 code:= ''; AssignFile(LCode, ExtractFilePath(Application.ExeName) + 'Ressources\Shaders\PhongPerPixel_Frag.txt'); Reset(LCode); while not EoF do begin readln(LCode, code1); code:= code + code1; end; CloseFile(LCode); i1:= Length(code); glShaderSourceARB(FFrag, 1, @code[1], @i1); glCompileShaderARB(FVert); glCompileShaderARB(FFrag); glAttachObjectARB(FProgram, FVert); glAttachObjectARB(FProgram, FFrag); glDeleteObjectARB(FVert); glDeleteObjectARB(FFrag); glLinkProgramARB(FProgram); ShowMessage(glSlang_GetInfoLog(FProgram)); glUseProgramObjectARB(FProgram); ShowMessage(glSlang_GetInfoLog(FProgram)); |
Autor: | Sascha Willems [ Mi Mär 31, 2010 14:25 ] |
Betreff des Beitrags: | Re: glShaderSource verursacht AccessViolation |
Prüf mal ob in deinem Shader nicht evtl. ungültige Zeichen vorkommen, sowas führt gerne zu AVs beim Laden eines Shaders. Ansonsten ists leichter den Shader direkt aus einer Stringlist zu laden, so mach ich das : Code: var
VShader : glHandle; ... SSource : TStringList; SLen : Integer; Source : String; ... SSource.LoadFromFile(pVShaderFile); Source := SSource.Text; SLen := Length(Source); glShaderSource(VShader, 1, @Source, @SLen); |
Autor: | Lossy eX [ Mi Mär 31, 2010 15:12 ] |
Betreff des Beitrags: | Re: glShaderSource verursacht AccessViolation |
glShaderSource bekommt laut den Manpages auf OpenGL.org einen Pointer auf ein Array welches Pointer enthält die auf Strings zeigen. Bei Count = 1 also einen Pointer auf einen Pointer der auf einen String zeigt. Der Header will auch einen PPGLChar und nicht nur einen PGLChar. Dadurch, dass du aber "@code[1]" machst erzwingst du einen Pointer auf einen String. Wenn du "@code" machen würdest, dann würdest du einen Pointer auf einen String bekommen. Da Strings aber bereits Pointer sind funktioniert das. Erste mal Dereferenzieren und du hast deine Stringvariable. Zweite mal Dereferenzieren und du bekommst die erste Stelle der Daten. Falls jemand Zweifel hat muss man sich nur mal anschauen was die Adresse 79726176 (rückwärts) für einen String ergibt, wenn man 2 Nibbles zu einem Zeichencode wandelt kommt "vary" raus. Seltsam. Außerdem mischt du da gerade die Methoden des 2.0er Kerns und der Erweiterung GL_ARB_shader_objects miteinander. Die eigentliche Methode die zu dem Rest deiner Methoden passt heißt glShaderSourceARB. Das könnte eventuell auch noch zu Problemen führen. |
Autor: | sharkman [ Mi Mär 31, 2010 17:01 ] |
Betreff des Beitrags: | Re: glShaderSource verursacht AccessViolation |
Ja, jetzt gehts. Danke! Das mit den Pointern war das Problem, das die AccessViolation verursacht hat, aber es war ein paar Zeilen weiter unten noch ein E/A Fehler 6, den ich wohl erst viel später gefunden hätte. Es sieht zwar noch immer nicht ganz so aus, wie sich der kleine Sharkman das vorstellt, aber das dürfte daran liegen, dass ich das Material falsch setze (den Fehler such ich aber selber, irgendwas muss ich ja auch zu meinem Programm beitragen ![]() |
Autor: | Ziz [ Mi Mär 31, 2010 17:19 ] |
Betreff des Beitrags: | Re: glShaderSource verursacht AccessViolation |
Du kennst unseren Chat noch nicht. ![]() http://wiki.delphigl.com/index.php/DGL-Chat |
Seite 1 von 1 | Alle Zeiten sind UTC + 1 Stunde |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |