Wiem ze to nie ladnie tak rzucac kodem ale zeby nie bylo watpliwosci, tak oto wyglada to co w tej chwili nie dziala:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <GL3/gl3.h>
#include <SDL/SDL.h>
#include <math.h>
#include "utils.h"
PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
PFNGLGENBUFFERSPROC glGenBuffers;
PFNGLBINDBUFFERPROC glBindBuffer;
PFNGLBUFFERDATAPROC glBufferData;
PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
PFNGLCREATESHADERPROC glCreateShader;
PFNGLSHADERSOURCEPROC glShaderSource;
PFNGLCOMPILESHADERPROC glCompileShader;
PFNGLCREATEPROGRAMPROC glCreateProgram;
PFNGLATTACHSHADERPROC glAttachShader;
PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation;
PFNGLLINKPROGRAMPROC glLinkProgram;
PFNGLUSEPROGRAMPROC glUseProgram;
PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray;
PFNGLDETACHSHADERPROC glDetachShader;
PFNGLDELETEPROGRAMPROC glDeleteProgram;
PFNGLDELETESHADERPROC glDeleteShader;
PFNGLDELETEBUFFERSPROC glDeleteBuffers;
PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv;
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
PFNGLCLEARCOLORPROC glClearColor;
PFNGLCLEARPROC glClear;
PFNGLGETSTRINGPROC glGetString;
PFNGLENABLEPROC glEnable;
PFNGLDEPTHFUNCPROC glDepthFunc;
PFNGLDRAWARRAYSPROC glDrawArrays;
PFNGLDRAWELEMENTSPROC glDrawElements;
PFNGLCLEARDEPTHPROC glClearDepth;
int main(int argc, char *argv[])
{
SDL_WindowID win;
SDL_GLContext ctx;
if (SDL_Init(SDL_INIT_VIDEO) < 0)
{
printf("Unable to initialize SDL");
SDL_Quit();
return 0;
}
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
win = SDL_CreateWindow("help me!", 20, 40, 512, 512, SDL_WINDOW_OPENGL | SDL_WINDOW_SHOWN);
if (!win)
{
printf("Unable to create window");
SDL_Quit();
return 0;
}
ctx = SDL_GL_CreateContext(win);
SDL_GL_SetSwapInterval(1);
glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glGenVertexArrays");
glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC) SDL_GL_GetProcAddress("glBindVertexArray");
glGenBuffers = (PFNGLGENBUFFERSPROC) SDL_GL_GetProcAddress("glGenBuffers");
glBindBuffer = (PFNGLBINDBUFFERPROC) SDL_GL_GetProcAddress("glBindBuffer");
glBufferData = (PFNGLBUFFERDATAPROC) SDL_GL_GetProcAddress("glBufferData");
glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC) SDL_GL_GetProcAddress("glVertexAttribPointer");
glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC) SDL_GL_GetProcAddress("glEnableVertexAttribArray");
glCreateShader = (PFNGLCREATESHADERPROC) SDL_GL_GetProcAddress("glCreateShader");
glShaderSource = (PFNGLSHADERSOURCEPROC) SDL_GL_GetProcAddress("glShaderSource");
glCompileShader = (PFNGLCOMPILESHADERPROC) SDL_GL_GetProcAddress("glCompileShader");
glCreateProgram = (PFNGLCREATEPROGRAMPROC) SDL_GL_GetProcAddress("glCreateProgram");
glAttachShader = (PFNGLATTACHSHADERPROC) SDL_GL_GetProcAddress("glAttachShader");
glBindAttribLocation = (PFNGLBINDATTRIBLOCATIONPROC) SDL_GL_GetProcAddress("glBindAttribLocation");
glLinkProgram = (PFNGLLINKPROGRAMPROC) SDL_GL_GetProcAddress("glLinkProgram");
glUseProgram = (PFNGLUSEPROGRAMPROC) SDL_GL_GetProcAddress("glUseProgram");
glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC) SDL_GL_GetProcAddress("glDisableVertexAttribArray");
glDetachShader = (PFNGLDETACHSHADERPROC) SDL_GL_GetProcAddress("glDetachShader");
glDeleteProgram = (PFNGLDELETEPROGRAMPROC) SDL_GL_GetProcAddress("glDeleteProgram");
glDeleteShader = (PFNGLDELETESHADERPROC) SDL_GL_GetProcAddress("glDeleteShader");
glDeleteBuffers = (PFNGLDELETEBUFFERSPROC) SDL_GL_GetProcAddress("glDeleteBuffers");
glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC) SDL_GL_GetProcAddress("glDeleteVertexArrays");
glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) SDL_GL_GetProcAddress("glUniformMatrix4fv");
glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) SDL_GL_GetProcAddress("glGetUniformLocation");
glDepthFunc = (PFNGLDEPTHFUNCPROC) SDL_GL_GetProcAddress("glDepthFunc");
glDrawElements = (PFNGLDRAWELEMENTSPROC) SDL_GL_GetProcAddress("glDrawElements");
glClearDepth = (PFNGLCLEARDEPTHPROC) SDL_GL_GetProcAddress("glClearDepth");
glClearColor = (PFNGLCLEARCOLORPROC) SDL_GL_GetProcAddress("glClearColor");
glClear = (PFNGLCLEARPROC) SDL_GL_GetProcAddress("glClear");
glGetString = (PFNGLGETSTRINGPROC) SDL_GL_GetProcAddress("glGetString");
glEnable = (PFNGLENABLEPROC) SDL_GL_GetProcAddress("glEnable");
glDrawArrays = (PFNGLDRAWARRAYSPROC) SDL_GL_GetProcAddress("glDrawArrays");
int i;
GLuint vao, vbo[3];
GLfloat projectionmatrix[16];
GLfloat modelmatrix[16];
const GLfloat identitymatrix[16] = IDENTITY_MATRIX4;
const GLfloat tetrahedron[4][3] = {
{ 1.0, 1.0, 1.0 },
{ -1.0, -1.0, 1.0 },
{ -1.0, 1.0, -1.0 },
{ 1.0, -1.0, -1.0 } };
const GLfloat colors[4][3] = {
{ 1.0, 0.0, 0.0 },
{ 0.0, 1.0, 0.0 },
{ 0.0, 0.0, 1.0 },
{ 1.0, 1.0, 1.0 } };
const GLubyte tetraindicies[6] = { 0, 1, 2, 3, 0, 1 };
GLchar *vertexsource, *fragmentsource, *geometrysource;
GLuint vertexshader, fragmentshader, geometryshader, shaderprogram;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(3, vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), tetrahedron, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)0, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), colors, GL_STATIC_DRAW);
glVertexAttribPointer((GLuint)1, 3, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo[2]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, 6 * sizeof(GLubyte), tetraindicies, GL_STATIC_DRAW);
vertexsource = filetobuf("tutorial4.vert");
geometrysource = filetobuf("tutorial4.geom");
fragmentsource = filetobuf("tutorial4.frag");
vertexshader = glCreateShader(GL_VERTEX_SHADER);
geometryshader = glCreateShader(GL_GEOMETRY_SHADER);
fragmentshader = glCreateShader(GL_FRAGMENT_SHADER);
glShaderSource(vertexshader, 1, (const GLchar**)&vertexsource, 0);
glShaderSource(geometryshader, 1, (const GLchar**)&geometrysource, 0);
glShaderSource(fragmentshader, 1, (const GLchar**)&fragmentsource, 0);
glCompileShader(vertexshader);
glCompileShader(geometryshader);
glCompileShader(fragmentshader);
shaderprogram = glCreateProgram();
glAttachShader(shaderprogram, vertexshader);
glAttachShader(shaderprogram, geometryshader);
glAttachShader(shaderprogram, fragmentshader);
glBindAttribLocation(shaderprogram, 0, "in_Position");
glBindAttribLocation(shaderprogram, 1, "in_Color");
glLinkProgram(shaderprogram);
glUseProgram(shaderprogram);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
printf("GLVER: %s\n", glGetString(GL_VERSION));
printf("GLSLV: %s\n", glGetString(GL_SHADING_LANGUAGE_VERSION));
printf("VENDR: %s\n", glGetString(GL_VENDOR));
printf("RENDR: %s\n", glGetString(GL_RENDERER));
perspective(projectionmatrix, 45.0, 1.0, 0.1, 100.0);
for (i=0; i < 360; i++)
{
memcpy(modelmatrix, identitymatrix, sizeof(GLfloat) * 16);
rotate(modelmatrix, (GLfloat)i * -1.0, X_AXIS);
rotate(modelmatrix, (GLfloat)i * 1.0, Y_AXIS);
rotate(modelmatrix, (GLfloat)i * 0.5, Z_AXIS);
translate(modelmatrix, 0, 0, -5.0);
multiply4x4(modelmatrix, projectionmatrix);
glUniformMatrix4fv(glGetUniformLocation(shaderprogram, "mvpmatrix"), 1, GL_FALSE, modelmatrix);
glClearColor(1.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glDrawElements(GL_TRIANGLE_STRIP, 6, GL_UNSIGNED_BYTE, 0);
SDL_GL_SwapWindow(win);
SDL_Delay(33);
}
glUseProgram(0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDetachShader(shaderprogram, vertexshader);
glDetachShader(shaderprogram, geometryshader);
glDetachShader(shaderprogram, fragmentshader);
glDeleteProgram(shaderprogram);
glDeleteShader(vertexshader);
glDeleteShader(geometryshader);
glDeleteShader(fragmentshader);
glDeleteBuffers(3, vbo);
glDeleteVertexArrays(1, &vao);
free(vertexsource);
free(geometrysource);
free(fragmentsource);
SDL_GL_DeleteContext(ctx);
SDL_DestroyWindow(win);
SDL_Quit();
return 0;
}
A oto shadery:
[b]vertex shader:[/b]
#version 150
precision highp float;
in vec3 in_Position;
in vec3 in_Color;
out vec3 geom_Color;
void main(void) {
gl_Position = vec4(in_Position, 1.0);
geom_Color = in_Color;
}
[b]geometry shader[/b]
#version 150
precision highp float;
uniform mat4 mvpmatrix;
// Declare what type of incoming primitive our geometry shader is receiving
layout(triangles) in;
// Declare what type of primitives we are creating and the maximum amount of vertices we will output per use of the geometry shader.
// We will be outputting 6 vertices per use of this shader, creating 2 triangles.
layout(triangle_strip, max_vertices = 6) out;
// Inputs to geometry shaders are always as arrays in the quantity of the incoming primitive
// In our case this value is 3, since triangles have 3 vertices
in vec3 geom_Color[3];
out vec3 ex_Color;
void main()
{
// simple iterator
int i;
// Create our original primitive
for (i=0; i < gl_in.length(); i++)
{
gl_Position = mvpmatrix * gl_in[i].gl_Position;
ex_Color = geom_Color[i];
EmitVertex();
}
EndPrimitive();
// Create a new primitive with negative x,y,z values
for (i=0; i < gl_in.length(); i++)
{
gl_Position = mvpmatrix * vec4(-gl_in[i].gl_Position.xyz, 1.0);
ex_Color = geom_Color[i];
EmitVertex();
}
EndPrimitive();
}
[b]fragment shader[/b]
#version 150
precision highp float;
in vec3 ex_Color;
out vec4 gl_FragColor;
void main(void) {
gl_FragColor = vec4(ex_Color,1.0);
}
Oczyscilem to wszystko z komentarzy i zamknalem wszystko w main zeby nie bylo watpliwosci co kiedy idzie. Moze cos zauwazycie ja juz wpatruje sie w to od kilku godzin.
A ha i takie male pytanko. Dlaczego SDL jest rozbity na kilka bibliotek? nie mowie o SDL_image czy SDL_audio whatever tylko o libSDL.a, libSDLmain.a oraz libSDL.dll.a. W sumie jeszcze nigdy nie interesowalem sie bibliotekami za bardzo wiec jakby ktos mogl to lopatologicznie wyjasnic bylbym wdzieczny. I jeszcze dlaczego musze je linkowac dokladnie w takiej kolejnosci: libSDLmain, libSDL.dll libSDL?
EDIT: przez pomylke dalem kod z ustawieniem kontekstu (SDL_GL_CONTEXT_MAJOR/MINOR_VERSION) na 2.1. To nie jest blad, z 3.2 tez nie dziala.. Juz poprawione