openglglfwfreepascallazarus

How to connect opengl_glad 4.6 and glfw to Lazarus free pascal?


I completely redid the code from the last question.It works, but with the standard opengl lazarus and with the glfw library, when glad_gl 4.6 is connected, it issues an external access violation error with the message access violation executing address $000000000000000000

Attempt to connect glad to free pascal opengl 4 6 Error at startup Wrong number of parameters specified for call to gladLoadGL

glfw.pas was taken from github https://github.com/Blueicaro/GLFW/blob/master/Glfw33/glfw.pas

program project1;


uses
gl, glad_gl, glfw;

var
  window: PGLFWwindow;

begin
  if glfwInit() = 0 then
  ExitCode := -1;

  window := glfwCreateWindow(640, 480, 'Hello World', nil, nil);
  if window = nil then
  begin
    glfwTerminate();
    ExitCode := -1;
  end;

  glfwMakeContextCurrent(window);

  while glfwWindowShouldClose(window) = 0 do
  begin
    glClear(GL_COLOR_BUFFER_BIT);
                      glBegin(GL_TRIANGLES);

                      glColor3d(1,0,0);


 glVertex2f(-1, -1);
 glColor3d(1,1,0);
 glVertex2f(1, -1);
 glColor3d(1,0,1);
 glVertex2f(0, 1);

 glEnd;
    glfwSwapBuffers(window);

    glfwPollEvents();
  end;

  glfwTerminate();
   ExitCode := 0;
end.            


connect opengl glad 4.6


Solution

  • program project;
    
    {$mode objfpc}{$H+} // Free Pascal Lazarus
    
    uses
      glad_gl, GLFW; // glad 4.6 version core
    
    var
      window: PGLFWwindow;
      shaderProgram: GLuint;
      VAO: GLuint;
      VBO: GLuint;
    
    function GetGLProcAddress(procname: PChar): Pointer; register;
    begin
      Result := Pointer(glfwGetProcAddress(procname));
    end;
    
    const
    
      vertexShaderSource: PChar =
        '#version 330 core'#10 +
        'layout (location = 0) in vec3 aPos;'#10 +
        'void main()'#10 +
        '{'#10 +
        '   gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);'#10 +
        '}';
    
    
      fragmentShaderSource: PChar =
        '#version 330 core'#10 +
        'out vec4 FragColor;'#10 +
        'void main()'#10 +
        '{'#10 +
        '   FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);'#10 +
        '}';
    
    procedure CompileShaders;
    var
      vertexShader, fragmentShader: GLuint;
      success: GLint;
      infoLog: array[0..511] of Char;
    begin
      vertexShader := glCreateShader(GL_VERTEX_SHADER);
      glShaderSource(vertexShader, 1, @vertexShaderSource, nil);
      glCompileShader(vertexShader);
      glGetShaderiv(vertexShader, GL_COMPILE_STATUS, @success);
      if success = 0 then
      begin
        glGetShaderInfoLog(vertexShader, 512, nil, infoLog);
        Writeln('Vertex shader compilation failed: ', infoLog);
      end;
      fragmentShader := glCreateShader(GL_FRAGMENT_SHADER);
      glShaderSource(fragmentShader, 1, @fragmentShaderSource, nil);
      glCompileShader(fragmentShader);
      glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, @success);
      if success = 0 then
      begin
        glGetShaderInfoLog(fragmentShader, 512, nil, infoLog);
        Writeln('Fragment shader compilation failed: ', infoLog);
      end;
      shaderProgram := glCreateProgram();
      glAttachShader(shaderProgram, vertexShader);
      glAttachShader(shaderProgram, fragmentShader);
      glLinkProgram(shaderProgram);
      glGetProgramiv(shaderProgram, GL_LINK_STATUS, @success);
      if success = 0 then
      begin
        glGetProgramInfoLog(shaderProgram, 512, nil, infoLog);
        Writeln('Shader program linking failed: ', infoLog);
      end;
      glDeleteShader(vertexShader);
      glDeleteShader(fragmentShader);
    end;
    procedure SetupTriangle;
    const
      vertices: array[0..8] of GLfloat = (
        -0.5, -0.5, 0.0,
         0.5, -0.5, 0.0,
         0.0,  0.5, 0.0
      );
    begin
      glGenVertexArrays(1, @VAO);
      glGenBuffers(1, @VBO);
      glBindVertexArray(VAO);
      glBindBuffer(GL_ARRAY_BUFFER, VBO);
      glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), @vertices, GL_STATIC_DRAW);
      glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), nil);
      glEnableVertexAttribArray(0);
      glBindVertexArray(0);
    end;
    begin
      if glfwInit = 0 then
      begin
        Writeln('Failed to initialize GLFW');
        Halt(-1);
      end;
      glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
      glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
      glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
      window := glfwCreateWindow(800, 600, 'Triangle with Shaders', nil, nil);
      if window = nil then
      begin
        Writeln('Failed to create GLFW window');
        glfwTerminate();
        Halt(-1);
      end;
      glfwMakeContextCurrent(window);
      if not gladLoadGL(@GetGLProcAddress) then
      begin
        Writeln('Failed to initialize Glad');
        Halt(1);
      end;
      CompileShaders;
      SetupTriangle;
      while glfwWindowShouldClose(window) = 0 do
      begin
        glClearColor(0.2, 0.3, 0.3, 1.0);
        glClear(GL_COLOR_BUFFER_BIT);
        glUseProgram(shaderProgram);
        glBindVertexArray(VAO);
        glDrawArrays(GL_TRIANGLES, 0, 3);
        glfwSwapBuffers(window);
        glfwPollEvents();
      end;
      glDeleteVertexArrays(1, @VAO);
      glDeleteBuffers(1, @VBO);
      glDeleteProgram(shaderProgram);
      glfwTerminate();
    end.
    

    this code draws a triangle for demonstration