GLSL - Anfängerfrage
-
Hi!
Wieder mal ne Anfängerfrage zum warm werden

Ich wollte mich mal in der Shaderprogrammierung umsehen und hab ein Tutorial gefunden, wobei der OpenGL-Part zwar funktioniert, aber es so scheint, als ob der Shader nicht "abgearbeitet" wird.Gibt es eine Möglichkeit irgendwie zu checken, ob Fragment-/Vertexshader bearbeitet wird?
Eigentlich ist der Code gut verständlich, nur würde ich erwarten, dass die Pixel auch die Farbe annehmen, die im FragmentShader steht (Blau), nur passiert das eben nicht. Liegt das möglicherweise an der GraKa (GeForce FX 5700VE)?
#include <stdio.h> #include "GL/glew.h" #include "GL/gl.h" #include "GL/glut.h" #include <windows.h> #pragma comment(lib,"lib/glew32.lib") char *VertexShaderSource; char *FragmentShaderSource; int VertexShader,FragmentShader; int ShaderProgram; GLfloat angle = 0.0; char *readShaderFile(char *FileName) { FILE *fp; char *DATA = NULL; int flength = 0; fp = fopen(FileName,"rt"); fseek(fp, 0, SEEK_END); flength = ftell(fp); rewind(fp); DATA = (char *)malloc(sizeof(char) * (flength+1)); flength = fread(DATA, sizeof(char), flength, fp); DATA[flength] = '\0'; fclose(fp); return DATA; } void display (void) { glClearColor (0.0,0.0,0.0,1.0); glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); glTranslatef(0,0,-5); glRotatef(angle,1,1,1); glUseProgramObjectARB(ShaderProgram); glutSolidCube(2); glutSwapBuffers(); angle++; } void InitShader (void) { GLEW_ARB_vertex_shader; GLEW_ARB_fragment_shader; VertexShader = glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB); FragmentShader = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB); VertexShaderSource = readShaderFile("VertexShader.vert"); FragmentShaderSource = readShaderFile("FragementShader.frag"); const char * VS = VertexShaderSource; const char * FS = FragmentShaderSource; glShaderSourceARB(VertexShader, 1, &VS,NULL); glShaderSourceARB(FragmentShader, 1, &FS,NULL); free(VertexShaderSource);free(FragmentShaderSource); glCompileShaderARB(VertexShader); glCompileShaderARB(FragmentShader); ShaderProgram = glCreateProgramObjectARB(); glAttachObjectARB(ShaderProgram,VertexShader); glAttachObjectARB(ShaderProgram,FragmentShader); glLinkProgramARB(ShaderProgram); } void DeInitShader (void) { glDetachObjectARB(ShaderProgram,VertexShader); glDetachObjectARB(ShaderProgram,FragmentShader); glDeleteObjectARB(ShaderProgram); } void Init (void) { glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); } void reshape (int w, int h) { glViewport (0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (60, (GLfloat)w / (GLfloat)h, 0.1, 1000.0); glMatrixMode (GL_MODELVIEW); } int main (int argc, char **argv) { glutInit (&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_DEPTH); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow ("GLSL - Test"); glewInit(); InitShader(); Init(); glutDisplayFunc (display); glutIdleFunc (display); glutReshapeFunc (reshape); glutMainLoop (); DeInitShader(); return 0; }**Vertexhader:
**
(VertexShader.vert - Hier passiert noch nix)void main() { // Set the position of the current vertex gl_Position = gl_ModelViewProjectionMatrix * glVertex; }FragmentShader
(FragementShader.frag - Nur Farbe setzen)void main() { // Set the output color of our current pixel gl_FragColor = vec4(0,0,1,1); }P.S.: Vielleicht auch für den ein oder anderen interessant: http://www.swiftless.com/tutorials/glsl/glsltuts.html
(Quelle des Beispiels)
-
mtx schrieb:
Liegt das möglicherweise an der GraKa (GeForce FX 5700VE)?
Gut möglich. Hast du aktuelle Treiber drauf? Welche OGL-Version unterstützt deine Graka? Wenn du die Shader kompilierst solltest du evtl. auch mal den Fehlercode auswerten.
-
Probier's mal damit. Zu viel Code zum überprüfen

-
*omg*
Wahnsinn! Da kann man sich ja tot suchen.Also sollte jemand denselben Fehler suchen:
Im Vertexshader:
gl_Position = gl_ModelViewProjectionMatrix * glVertex;
durch
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;esetzen. That´s it

Aber trotzdem vielen Dank für eure Hilfe!
-
Musst nur filmors Link folgen und solche Fehler stehen textuell auf Deinem Bildschirm

-
ja, die glGetProgramiv() hab ich auch benutzt. Allerdings läuft das Programm mit der Methode auf meinem Heim-Rechner nicht.
Liegt vermutlich an OpenGL 2.0.
Ich hab Version 1.5.2. Wie kann man denn ne neue Version bekommen? Hängt die vom GraKa-Treiber ab?
-
also es liegt offensichtlich am GraKa-Treiber. Hab mir einen neuen NVidia-Treiber gezogen uns installiert. Nun hab ich die OpenGL-Version 2.0.1. Jetzt sollte auch die o.g. Methode funktionieren
