Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Spiele-/Grafikprogrammierung ::  Texturen zusammenfügen!     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
Chris Benoit!
Mitglied

Benutzerprofil
Anmeldungsdatum: 01.10.2006
Beiträge: 69
Beitrag 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
Beitrag 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
Beitrag Chris Benoit! Mitglied 22:33:02 02.02.2012   Titel:              Zitieren

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

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
Beitrag 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
Beitrag 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
Beitrag 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
Beitrag 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! :die:

Selber :die: , 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
Beitrag 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




Beitrag 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
Beitrag 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
Beitrag 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 :rolleyes:
ScottZhang
Mitglied

Benutzerprofil
Anmeldungsdatum: 17.12.2010
Beiträge: 207
Beitrag 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
Beitrag 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
Beitrag Chris Benoit! Mitglied 17:31:18 03.02.2012   Titel:              Zitieren

Achso! Werds probieren - danke :live:

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
Beitrag 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/
C/C++ Forum :: Spiele-/Grafikprogrammierung ::  Texturen zusammenfügen!   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




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.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.