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
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
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