Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mi Mai 29, 2024 02:25

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mi Mär 31, 2010 12:14 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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));


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 31, 2010 14:25 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
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);

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 31, 2010 15:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 31, 2010 17:01 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
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.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Mär 31, 2010 17:19 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 20, 2005 13:18
Beiträge: 1054
Wohnort: Dresden
Programmiersprache: C, C++, Pascal, OPL
Du kennst unseren Chat noch nicht. 8)
http://wiki.delphigl.com/index.php/DGL-Chat

_________________
Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut.
Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’.
Und du schaust mich an und fragst ob ich das kann.
Und ich denk, ich werd' mich ändern irgendwann.

_________________Farin Urlaub - Bewegungslos


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 16 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 14 Queries | GZIP : On ]