Autor
Nachricht
Chris Benoit!
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Chris Benoit! Mitglied
21:31:26 02.02.2012 Titel:
Texturen zusammenfügen!
Zitieren
Hallo,
Ich habe 2 Texturen und 1 Viereck! Ich würde gerne beide Texturen auf der Oberfläche haben! Das Problem dabei: Eine Texture manipuliere ich im Shader, daher kann ich nicht einfach das normale multitexturing nutzen... wie löse ich das jetzt?
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
hustbaer Mitglied
21:43:38 02.02.2012 Titel:
Zitieren
Ich verstehe die Frage nicht.
Was genau ist dein Problem?
Du kannst zwei Sampler definieren, da zwei verschiedene Texturen reinstecken, über die Sampler dann die Texturen im Shader lesen, und damit machen was du magst.
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Chris Benoit!
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Chris Benoit! Mitglied
22:33:02 02.02.2012 Titel:
Zitieren
Ich habe wohl Probleme die beiden Texturen in den Shader zu kriegen!
So mach ich das:
Code: 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, WaterTex);
glUniform1i(Texture1, WaterTex);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Reflect);
glUniform1i(Texture2, Reflect);
Code: 1 2 3 4 5 6 7 8 9
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, WaterTex);
glUniform1i(Texture1, WaterTex);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Reflect);
glUniform1i(Texture2, Reflect);
Code: 1 2 3 4 5 6 7 8 9
glActiveTexture(GL_TEXTURE0);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, WaterTex);
glUniform1i(Texture1, WaterTex);
glActiveTexture(GL_TEXTURE1);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, Reflect);
glUniform1i(Texture2, Reflect);
Das wären beide Texturen!
Im Shader gibt es natürlich noch diese Zeilen:
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Sowie im Shader dann:
Code: uniform sampler2D WaterTex;
uniform sampler2D RefTex;
Code: uniform sampler2D WaterTex;
uniform sampler2D RefTex;
Code: uniform sampler2D WaterTex;
uniform sampler2D RefTex;
Warum geht es nicht?
ScottZhang
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 207
ScottZhang Mitglied
23:29:43 02.02.2012 Titel:
Zitieren
Chris Benoit! schrieb:
Im Shader gibt es natürlich noch diese Zeilen:
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Code: Texture1 = glGetUniformLocation(ReflectionShader, "WaterTex");
Texture2 = glGetUniformLocation(ReflectionShader, "RefTex");
Im Shader?
Ist dein Shader auch aktiv? (glUseProgram)
Btw, glEnable(GL_TEXTURE_2D) brauchst du nur für FixedFunctionPipe.
_________________ If anything has been made foolproof, a better fool will be developed.
Hobby
Chris Benoit!
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Chris Benoit! Mitglied
23:32:30 02.02.2012 Titel:
Zitieren
Ähm. Da hab ich mich wohl schlecht ausgedrückt!
Ich meinte in den Codezeilen wo ich den Shader erstelle!
Der Shader ist definitiv aktiv, ich führe dort auch andere Aktionen durch die funktionieren.
Also würde eig. auch das genügen:
Code: glActiveTexture(GL_TEXTURE0);
glUniform1i(Texture1, WaterTex);
Code: glActiveTexture(GL_TEXTURE0);
glUniform1i(Texture1, WaterTex);
Code: glActiveTexture(GL_TEXTURE0);
glUniform1i(Texture1, WaterTex);
?
Zuletzt bearbeitet von Chris Benoit! am 23:32:41 02.02.2012, insgesamt 1-mal bearbeitet
ScottZhang
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 207
ScottZhang Mitglied
23:40:50 02.02.2012 Titel:
Zitieren
Versuch mal glUniform1i(Texture[n+1], n) für GL_TEXTUREn
_________________ If anything has been made foolproof, a better fool will be developed.
Hobby
Zuletzt bearbeitet von ScottZhang am 23:42:24 02.02.2012, insgesamt 2-mal bearbeitet
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
hustbaer Mitglied
13:04:03 03.02.2012 Titel:
Zitieren
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.
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
dot Mitglied
13:16:41 03.02.2012 Titel:
Zitieren
Zeig doch bitte mal deinen Shadercode. Und verrat uns doch mal was "geht nicht" genau bedeutet...
_________________ one point of view will never reveal the entire scene.
Zuletzt bearbeitet von dot am 13:17:22 03.02.2012, insgesamt 1-mal bearbeitet
MisterX
Unregistrierter
MisterX Unregistrierter
13:47:59 03.02.2012 Titel:
Zitieren
Ein Beispiel wie es geht:
C/C++ Code: 1 2 3 4 5 6 7 8 9
1 2 3 4 5 6 7 8 9
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);
...
C/C++ Code: 1 2 3 4 5 6 7 8 9
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);
...
C/C++ Code: 1 2 3 4 5 6 7 8 9
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:
C/C++ Code: //Deklaration der zu verwendenden Texturen
// Die Reihenfolge ist durch die Verwendung von glGetUniformLocation hier egal.
uniform sampler2D WaterTex;
uniform sampler2D RefTex;
C/C++ Code: //Deklaration der zu verwendenden Texturen
// Die Reihenfolge ist durch die Verwendung von glGetUniformLocation hier egal.
uniform sampler2D WaterTex;
uniform sampler2D RefTex;
C/C++ Code: //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.
dot
Mitglied
Benutzerprofil
Anmeldungsdatum: 20.05.2004
Beiträge: 3858
dot Mitglied
14:36:58 03.02.2012 Titel:
Zitieren
Das ist doch wohl nicht dein ganzer Shader? Das sind ja nur zwei Deklarationen, interessant wär aber was der Shader tut...
_________________ one point of view will never reveal the entire scene.
Zuletzt bearbeitet von dot am 14:37:30 03.02.2012, insgesamt 1-mal bearbeitet
Chris Benoit!
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Chris Benoit! Mitglied
16:39:32 03.02.2012 Titel:
Zitieren
Ich zeige gerne mal die kompletten Sachen:
Erstmal der Code in C:
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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 ");
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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 ");
C/C++ Code: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
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:
C/C++ Code: glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Reflection);
glUniform1i(Texture1, Reflection);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, WaterTexture);
glUniform1i(Texture2, WaterTexture);
C/C++ Code: glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Reflection);
glUniform1i(Texture1, Reflection);
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, WaterTexture);
glUniform1i(Texture2, WaterTexture);
C/C++ Code: 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:
Code: uniform sampler2D WaterTex;
uniform sampler2D RefTex;
Code: uniform sampler2D WaterTex;
uniform sampler2D RefTex;
Code: 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
ScottZhang
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 207
ScottZhang Mitglied
16:52:09 03.02.2012 Titel:
Zitieren
wie oft den noch:
Wenn du GL_TEXTUREn im Shader haben willst, musst du
glUniform1i(<Deine Location>, n )
aufrufen!
_________________ If anything has been made foolproof, a better fool will be developed.
Hobby
ScottZhang
Mitglied
Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 207
ScottZhang Mitglied
16:55:14 03.02.2012 Titel:
Zitieren
Bsp anhand deines Codes
C/C++ Code: Texture1 = glGetUniformLocation(ReflectionShader, "RefTex ");
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Reflection);
glUniform1i(Texture1, 0);
C/C++ Code: Texture1 = glGetUniformLocation(ReflectionShader, "RefTex ");
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Reflection);
glUniform1i(Texture1, 0);
C/C++ Code: Texture1 = glGetUniformLocation(ReflectionShader, "RefTex ");
...
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, Reflection);
glUniform1i(Texture1, 0);
_________________ If anything has been made foolproof, a better fool will be developed.
Hobby
Chris Benoit!
Mitglied
Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Chris Benoit! Mitglied
17:31:18 03.02.2012 Titel:
Zitieren
Achso! Werds probieren - danke
Ok klappt alles!
Danke
Zuletzt bearbeitet von Chris Benoit! am 17:44:40 03.02.2012, insgesamt 1-mal bearbeitet
hustbaer
Mitglied
Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 13529
hustbaer Mitglied
19:25:21 03.02.2012 Titel:
Zitieren
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.
_________________ "Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.