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 :roll: ). Jedenfalls Danke. Und die Antworten kommen da ja schneller als in einem Chat.

Autor:  Ziz [ Mi Mär 31, 2010 17:19 ]
Betreff des Beitrags:  Re: glShaderSource verursacht AccessViolation

Du kennst unseren Chat noch nicht. 8)
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/