[SOLVED] GLSL - Shader



  • Hallo!

    Ich versuche derzeit kläglich per-Pixel-Lighting zu programmieren. Ich nutze GLEW und eine ARB extension (was genau weiß ich selbst nicht 😞 ):

    Ich bin "gezwungen" glUseProgramObjectARB() in initializeGL() (anstatt in paintGL()) zu schreiben, sonst kommt eine (Qt-spezifische) Meldung:

    QOpenGLPaintEngine: Failed to create fragment programs.

    (ich hoffe das ist kein Qt Problem). Jedoch will ich für diverse Anzeigen pixel-lighing ausschalten, die die schrift so zB nur noch schwer erkennbar ist!

    void glWidget::initGL()
    {
    	GLhandleARB programObject;
    	GLhandleARB vertexShaderObject;
    	GLhandleARB fragmentShaderObject;
    
    	programObject = glCreateProgramObjectARB();
    	vertexShaderObject = createShaderARB(GL_VERTEX_SHADER_ARB, "src/shaders/pixelLighting.vert");
    	fragmentShaderObject = createShaderARB(GL_FRAGMENT_SHADER_ARB, "src/shaders/pixelLighting.frag");
    
    	glAttachObjectARB(programObject, vertexShaderObject);
    	glAttachObjectARB(programObject, fragmentShaderObject);
    
    	glDeleteObjectARB(vertexShaderObject);
    	glDeleteObjectARB(fragmentShaderObject);
    
    	glLinkProgramARB(programObject);
    	perPixelLighting = &programObject;
            //Wenn es hier steht, geht es:
            glUseProgramObjectARB(*perPixelLighting); 
    }
    
    void glWidget::paintGL()
    {
            glMatrixMode(GL_MODELVIEW);
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    
            //Hier kommt eine Meldung und der shader funktioniert offensichtlich nicht
    	glUseProgramObjectARB(*perPixelLighting);
    
            //Szene zeichnen
    
            //Hier hätte ich den shader theoretisch "deaktiviert":
            glUseProgramObjectARB(0);
    
            //Anzeigen
            glMatrixMode(GL_PROJECTION);
    	glPushMatrix();
    		glLoadIdentity(); 
    		glOrtho(0, width(), height(), 0, -50, 50);
    	glMatrixMode(GL_MODELVIEW);
    
    	glPushMatrix(); 
    		glLoadIdentity();
    		//Anzeigen zeichnen
    	glPopMatrix();
    
    	glMatrixMode(GL_PROJECTION);
    	glPopMatrix();
    	glMatrixMode(GL_MODELVIEW);
    }
    

    Ich hoffe ihr versteht was ich meine 🤡



  • Dein Handle für programObject ist lokal definiert, wenn initGL verlassen wird, existiert das handle nich mehr... da hilfts auch nichts einen pointer drauf zu speichern



  • Wie dumm von mir... 🙄
    Danke!


Anmelden zum Antworten