I’ve wasted so much time on this I just need to stop and ask for help already. 
Over the last few years I’ve been picking away at OpenGL and only ever got the 
legacy 2.x API to work which has been fine for making 2D games but I wanted to 
at least learn the modern API and shaders.

Here’s a snippet I cobbled together from a test program. It merely wants to 
draw a triangle. The actual OpenGL is from a tutorial and I don’t see how 
anything could be simpler than this. The only thing curious to me is why I 
can’t load the version of OpenGL I want from SDL. If I attempt to load 4.0 
(with SDL_GL_SetAttribute) GL_VERSION returns null but if I load 3.3 it works 
and GL_VERSION returns 4.1 anyways (I’m a Mac from 2015).

I removed the error handling code here but I don’t get any errors, just a black 
screen. Despite the tutorial I was following not using a shader they still got 
a white triangle (I added a shader also but it still didn’t work so I removed 
it to reduce complexity). The only thing I can think of is they were using GLEW 
and it did some init that SDL isn’t doing but I doubt it. This is barebones 
simple OpenGL here.

Any ideas on what’s wrong with this? I don’t care about this example in 
particular I just want to draw ANYTHING using OpenGL 3.3 so I can move forward.

=====

type
        TVec2 = record
                x, y: GLfloat;
        end;

var
        verts: array[0..2] of TVec2;
        bufferID: GLuint;       
        vao: GLuint;
        
// run sdl window
if SDL_Init(SDL_INIT_VIDEO) < 0 then
        Fatal('SDL could not initialize! '+SDL_GetError);

// load function pointers
if Load_GL_VERSION_3_3 = false then
        Fatal('OpenGL is not loaded');

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
// NOTE: 4.0 doesn't work, GL_VERSION return null
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 3);   
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
                
// create window        
window := SDL_CreateWindow('SDL Tutorial', SDL_WINDOWPOS_UNDEFINED, 
SDL_WINDOWPOS_UNDEFINED, width, height, SDL_WINDOW_SHOWN + SDL_WINDOW_OPENGL);
context := SDL_GL_CreateContext(window);
SDL_GL_MakeCurrent(window, context);
SDL_GL_SetSwapInterval(1);

writeln('Vendor: ', glGetString(GL_VENDOR));
writeln('OpenGL Version: ', glGetString(GL_VERSION));
writeln('GLSL Version: ', glGetString(GL_SHADING_LANGUAGE_VERSION));

// NOTE: despite SDL_GL_SetAttribute asking for 3.3 and 4.0 failing GL_VERSION 
still returns 4.1
// Vendor: Intel Inc.
// OpenGL Version: 4.1 INTEL-10.25.13
// GLSL Version: 4.10 

// setup
glViewPort(0, 0, width, height);

// simplest example possible
// https://www.youtube.com/watch?v=Dyue3MzJDss
verts[0].x := 0.0;
verts[0].y := 1.0; 
verts[1].x := -1.0;
verts[1].y := -1.0; 
verts[2].x := 1.0;
verts[2].y := -1.0;

// NOTE: glEnableVertexAttribArray returns an error if I don't bind a vao
glGenVertexArrays(1, @vao);
glBindVertexArray(vao);

// gen array buffer and bind to verts
glGenBuffers(1, @bufferID);
glBindBuffer(GL_ARRAY_BUFFER, bufferID);
glBufferData(GL_ARRAY_BUFFER, sizeof(verts), @verts, GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(TVec2), nil);

// draw loop
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glDrawArrays(GL_TRIANGLES, 0, 3);
SDL_GL_SwapWindow(window);
...


Regards,
        Ryan Joseph

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to