Texturen zusammenfügen!



  • Versuch mal glUniform1i(Texture[n+1], n) für GL_TEXTUREn



  • Chris Benoit! schrieb:

    Ich habe wohl Probleme die beiden Texturen in den Shader zu kriegen! 👎

    Selber 👎 , was kann ich dafür dass du es nicht schaffst zu beschreiben was dein eigentliches Problem ist?
    Die Info dass du mit OpenGL arbeitest wäre auch wichtig gewesen, aber das wissen wir ja nun auch.

    Da ich mit OpenGL noch nicht gearbeitet habe, kann ich dir aber leider nicht weiter helfen.



  • Zeig doch bitte mal deinen Shadercode. Und verrat uns doch mal was "geht nicht" genau bedeutet...



  • Ein Beispiel wie es geht:

    glActiveTexture(GL_TEXTURE0);
    	glBindTexture(GL_TEXTURE_2D, WaterTex);	
    	glUniform1i(glGetUniformLocation(ReflectionShader, "WaterTex"), 0);
    
    	glActiveTexture(GL_TEXTURE1);
    	glBindTexture(GL_TEXTURE_2D,  Reflect);
    	glUniform1i(glGetUniformLocation(ReflectionShader, "Reflect"), 1);	
    
    ...
    

    Im Shader sieht es dann so aus:

    //Deklaration der zu verwendenden Texturen
    // Die Reihenfolge ist durch die Verwendung von glGetUniformLocation hier egal.
    uniform sampler2D WaterTex;
    uniform sampler2D RefTex;
    

    Also:

    1. Textureinheit aktivieren glActiveTexture(GL_TEXTURE0);
    (Auf die Erhöhung der Nummer bei jeder weiteren Textur achten)

    2. gewünschte Textur binden.

    3. glGetUniformLocation verwenden um den Zugriffsindex zu erhalten. Als Variablen die Programmvariable des Shaders und den Namen der Textur im Shader angeben.

    4. glUniform1i mit der ersten Variable den Zugriffsindex (siehe Punkt3) und als zweite Variable eine fortalufende Nummer für jede verwendete Textur.



  • Das ist doch wohl nicht dein ganzer Shader? Das sind ja nur zwei Deklarationen, interessant wär aber was der Shader tut...



  • Ich zeige gerne mal die kompletten Sachen:

    Erstmal der Code in C:

    void LoadReflectionShader()
    {
    	GLuint v, f;
    	char *vs = NULL, *fs = NULL;
    	v = glCreateShader(GL_VERTEX_SHADER);
    	f = glCreateShader(GL_FRAGMENT_SHADER);
    
    	vs = textFileRead("game/Shader/Reflection.vert");
    	fs = textFileRead("game/Shader/Reflection.frag");
    
    	const char * vv = vs;
    	const char * ff = fs;
    
    	glShaderSource(v, 1, &vv,NULL);
    	glShaderSource(f, 1, &ff,NULL);
    
    	delete vs;
    	delete fs;
    
    	glCompileShader(v);
    	glCompileShader(f);
    	ReflectionShader = glCreateProgram();
    
    	glAttachShader(ReflectionShader, v);
    	glAttachShader(ReflectionShader, f);
    	glLinkProgram(ReflectionShader);
    	glUseProgram(ReflectionShader);
    
    	Texture1 = glGetUniformLocation(ReflectionShader, "RefTex");
    	Texture2 = glGetUniformLocation(ReflectionShader, "WaterTex");
    

    Texture1 und 2 sind 2 globale Variablen vom Typ GLuint.

    Dann natürlich noch das:

    glActiveTexture(GL_TEXTURE0);
    	glBindTexture(GL_TEXTURE_2D, Reflection);
    	glUniform1i(Texture1, Reflection);
    
    	glActiveTexture(GL_TEXTURE1);
    	glBindTexture(GL_TEXTURE_2D, WaterTexture);
    	glUniform1i(Texture2, WaterTexture);
    

    Im Shader dann sollte ich auf beide Texturen so zugreifen können:

    uniform sampler2D WaterTex;
    uniform sampler2D RefTex;
    

    Der Shader an sich läd ja auch sonst ohne Probleme und ich kann dort drin arbeiten, nur eben die Texturen kommen da nicht an 🙄



  • wie oft den noch:

    Wenn du GL_TEXTUREn im Shader haben willst, musst du

    glUniform1i(<Deine Location>, n)

    aufrufen!



  • Bsp anhand deines Codes

    Texture1 = glGetUniformLocation(ReflectionShader, "RefTex");
    
    ...
    
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, Reflection);
    glUniform1i(Texture1, 0);
    


  • Achso! Werds probieren - danke 👍

    Ok klappt alles!
    Danke 🙂



  • ScottZhang schrieb:

    wie oft den noch:

    Wenn du GL_TEXTUREn im Shader haben willst, musst du

    glUniform1i(<Deine Location>, n)

    aufrufen!

    Aaaah, jetzt hab glaub ich sogar ich es verstanden. 🙂
    Da ist halt auch das dumme dass OGL nicht type-safe ist, weil überall und für alles einfach Integers verwendet werden.


Anmelden zum Antworten