OpenGL glsl - Shader Beispiel
-
Hallo , ich scheitere leider immer wieder daran einen Shader in ein Programm einzubinden.
Wäre einer so nett und schreibt mir ein Minimalprogramm das Vertex/Fragmentshader verwendet?
Es soll nichts großes sein, ich will nur die Schritte im Programm sehen die die Shader einbinden.
Shader selbst zu finden ist kein Problem aber das Einbinden ist mein Problem.
Vor allem die Funktion
glShaderSource die einen StringPointer erwartet macht mir Kopfschmerzen.
In dem Buch steht:
The shader needs to be in a string so you can load it.Wie bekomme ich einen Shader in einen String?
Einfach die Datei einlesen?string s= "";
while(read)
s += eingelesenes Zeichen???Das Beispiel aus dem Buch :
GLchar * myStringPtrs[1]; myStringPtrs[0] = vertexShaderText;
nur was vertexShaderText eigentlich ist weiß ich nicht...
weiter gehts:
glShaderSource( myVertexShader, 1, myStringPtrs, NULL);
das wars für den VertexShader...
aber leider komme ich damit nicht klar...
Ich bitte euch mir zu helfen und entgegen der Gewohnheit ein fertiges Progrämmlein zu posten das ich studieren kann^^
-
ravenheart schrieb:
Wie bekomme ich einen Shader in einen String?
Einfach die Datei einlesen?Genau
ravenheart schrieb:
Ich bitte euch mir zu helfen und entgegen der Gewohnheit ein fertiges Progrämmlein zu posten das ich studieren kann^^
Meine OpenGL Tests sind noch nicht so weit das ich etwas Zeichne, daher kann dir nur den Code den ich zum laden der Shader verwende anbieten. Getestet ist das ganze daher natürlich auch noch nicht richtig.
void loadFile(char *filename, char **buffer) { FILE* file = fopen(filename, "rb"); fseek(file, 0, SEEK_END); long len = ftell(file); fseek(file, 0, SEEK_SET); void* buf = malloc((size_t)len+1); fread(buf, 1, (size_t)len, file); *buffer = (char*)buf; (*buffer)[len] = 0; } void prepareShader() { // Shader char *vs, *fs; GLuint vShader, fShader; vShader = glCreateShader(GL_VERTEX_SHADER); fShader = glCreateShader(GL_FRAGMENT_SHADER); // Load shader program from file loadFile("minimal.vert", &vs); loadFile("minimal.frag", &fs); const char* cvs = vs; const char* cfs = fs; glShaderSource(vShader, 1, &cvs, NULL); glShaderSource(vShader, 1, &cfs, NULL); glCompileShader(vShader); glCompileShader(fShader); // Program (auch GLuint) program = glCreateProgram(); glAttachShader(program, vShader); glAttachShader(program, fShader); glLinkProgram(program); glUseProgram(program); }
Edit: Die loadFile korrigiert