IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Delphi Discussion :

[D6] Violation d'accès à l'apple de glShaderSource


Sujet :

Langage Delphi

  1. #1
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 674
    Points : 7 063
    Points
    7 063
    Par défaut [D6] Violation d'accès à l'apple de glShaderSource
    J'ai découvert le nouveau tutoriel (http://alexandre-laurent.developpez....L/OpenGL-GLSL/) sur les shaders, et j'ai voulu le tester.
    Mais, j'obtiens une violation d'accès sur glShaderSource.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    var
       szSourceTmp: String;
       SourceVertex, SourceFragment, Log: PGLchar;
       nTailleVertex, nTailleFragment, nEtatProgramme, nTailleLog: GL.GLint;
    begin
       szSourceTmp := LectureFichierShader('VERTEX_SHADER', nTailleVertex);
       GetMem(SourceVertex, nTailleVertex);
       try
          StrPCopy(PChar(SourceVertex), szSourceTmp);
     
          // Création de l'ID du vertex shader.
          _nIDVertex := glCreateShader(GL_VERTEX_SHADER);
     
          // Test des erreurs OpenGL.
          if TestErreur('Initialisations OpenGL', True) then
          begin
             _bErreurInit := True;
             Exit;
          end;
     
          // Chargement des sources dans OpenGL.
          glShaderSource(_nIDVertex, 1, SourceVertex, @nTailleVertex);   // <-- VIOLATION D'ACCES ICI !
       finally
          FreeMem(SourceVertex);
       end;
    En pas-à-pas, tout se passe bien jusqu'à glShaderSource. SourceVertex contient bien le source du shader.

    Je précise que la fonction existe bien. Au début, j'avais oublié de charger les fonctions étendues, mais cette fois c'est fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    glShaderSource := wglGetProcAddress('glShaderSource');
        if not Assigned(glShaderSource) then Exit;
    Une idée ?
    Je suis en OpenGL 2.1 : ca ne doit pas poser de problème, non ?


  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    l'erreur est sans doute dans SourceVertex qui doit être un pointer vers un tableau de PChar...de taille 1 dans ton cas

    or tu passes un simple PChar il faudrait @PChar

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    var 
       szSourceTmp: String;
       pTmp: PChar;
       SourceVertex, SourceFragment, Log: PGLchar;  
    begin
      pTmp := PChar(szSourceTmp);
      SourceVertex := @pTmp;
      ...
    end;

  3. #3
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 674
    Points : 7 063
    Points
    7 063
    Par défaut
    Ca marche !
    Citation Envoyé par Paul TOTH Voir le message
    un pointer vers un tableau de PChar...de taille 1 dans ton cas
    Par contre, ca ne me serait jamais venu à l'esprit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      GLchar = Char;
      PGLchar = ^GLchar;
    Moi, en lisant ça, je me suis dit que PGLchar était un pointeur de Char; donc un PChar.

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 457
    Points
    28 457
    Par défaut
    oui mais la fonction le précise bien :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void glShaderSource(	GLuint  	shader,
     	GLsizei  	count,
     	const GLchar ** 	string,
     	const GLint * 	length);

    c'est en lisant le tuto que j'ai vu que la fonction acceptait des tableaux.

    Je me suis crée une unité DelphiGL qui supprime tous ces types GL et les remplace par les types de base de Delphi (Integer, Cardinal, Single, Double), ça évite de se poser des questions Par contre mon unité n'utilise pas les Shaders, faudra que je regarde ça un jour

    exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    function glShaderSource(Shader: Cardinal; Count: Integer; Str: PPChar; Len: PInteger);

  5. #5
    Expert éminent
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 674
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 674
    Points : 7 063
    Points
    7 063
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    oui mais la fonction le précise bien :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void glShaderSource(	GLuint  	shader,
     	GLsizei  	count,
     	const GLchar ** 	string,
     	const GLint * 	length);

    c'est en lisant le tuto que j'ai vu que la fonction acceptait des tableaux.
    Arg ! J'avais pas fait attention à ça.

    Citation Envoyé par Paul TOTH Voir le message
    Je me suis crée une unité DelphiGL qui supprime tous ces types GL et les remplace par les types de base de Delphi (Integer, Cardinal, Single, Double), ça évite de se poser des questions
    J'ai pas le courage de me lancer là-dedans pour l'instant. Mais, ça doit bien rendre service, effectivement.

    Citation Envoyé par Paul TOTH Voir le message
    Par contre mon unité n'utilise pas les Shaders, faudra que je regarde ça un jour
    Moi, je commence seulement de tester les shaders, grace au nouveau tutoriel.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. ReportPrinterDialog (QR2) : violation d'accès..
    Par Harry dans le forum Bases de données
    Réponses: 5
    Dernier message: 30/12/2004, 14h04
  2. [XMLDocument] Violation d'accès
    Par xant dans le forum Composants VCL
    Réponses: 8
    Dernier message: 29/09/2004, 15h39
  3. requete / violation d'accès
    Par marie253 dans le forum Bases de données
    Réponses: 4
    Dernier message: 13/08/2004, 13h29
  4. Violation d'acces apres Execute
    Par SegmentationFault dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 10/08/2004, 16h23
  5. Violation d'accès apres Close
    Par SegmentationFault dans le forum Bases de données
    Réponses: 3
    Dernier message: 05/07/2004, 16h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo