Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Mai 14, 2024 18:27

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 11, 2010 21:34 
Offline
DGL Member

Registriert: So Sep 05, 2010 17:46
Beiträge: 15
Krug zum Gruße,

ich bin noch relativ neu in der Materie und habe gestern mal angefangen, mit ein wenig mit GLSL zu beschäftigen.
Dabei habe ich ein Verständnisproblem bezüglich der Nutzung von Texturen.

Die Textur wurde geladen.
Im Fragmentshader deklariere ich ein uniform sampler Variable um mit der Textur zu arbeiten.
Die Shader funktionieren soweit auch einwandfrei.

Allerdings muss ich die uniform folgendermassen setzen:

Code:
glUniform1i(location,0);

anstatt wie ich eigentlich dachte durch
Code:
glUniform1i(location,textureID);

wobei textureID das von glGenTexture(1,&textureID) gesetzte handel für die entsprechende Textur ist (Wert ist 1).

Mir ist also nicht klar warum ich 0 anstatt dem handel an den shader übergeben muss.

Eigentlich nicht nötig denke ich, aber hier meine gebastelten Shader:
Vertex-Shader:
Code:
#version 150
uniform mat4 mvmatrix;      // modelviewmatrix
uniform mat4 projmatrix;   // projectionmatrix

in vec3 vinvertex;      // incoming vertex
in vec3 vincolor;      // incoming color
in vec2 vintex;         // incoming texture-coord

out vec3 voutcolor;      // pass color to frag-shader
out vec2 vouttex;      // pass texture-coord to frag-shader

void main()
{
   vouttex = vintex;
   voutcolor = vincolor;
   gl_Position =  projmatrix * (mvmatrix * vec4(vinvertex,1.0));
}


Fragment-Shader:
Code:
#version 150
uniform sampler2D texture0;
in vec3 voutcolor;   // vertex-color passed by vertexshader
in vec2 vouttex;   // texture-coords
out vec4 col;      // final color

void main()
{
   vec4 coltmp = vec4(voutcolor,1.0);
   col = coltmp * texture(texture0,vouttex.st);
}


Würde mich über einen kurzen Tip oder eine kleine Erklärung freuen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 12, 2010 08:09 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Der Sampler (im Shader) greift nicht über die ID auf eine Textur zu, sondern direkt auf die Textureinheit (TMU), und genau diese setzt du über die Uniform-Variable. Wenn du also eine Textur auf TMU0 gebunden hast, dann musst du auch 0 bei glUniform übergeben. Ist die Textur hingegen auf TMU3 gebunden entsprechend die 3. Der Shader kann also nicht direkt auf die Textur zugreifen, sondern nur auf die Textureinheit, deren Anzahl ja durch die Hardware begrenzt ist. Ein Zugriff über eine Textur-ID würde ja dieses Textureinheitenlimit umgehen und ist daher rein technisch nicht möglich.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 12, 2010 08:49 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
In der Zusammenfassung:
Code:
glUniform1i(location,tmu);
glActiveTexture(GL_TEXTURE0 + tmu);
glBindTexture(GL_TEXTURE_2D, textureID);

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 14, 2010 01:27 
Offline
DGL Member

Registriert: So Sep 05, 2010 17:46
Beiträge: 15
Das leuchtet ein - ich danke euch herzlich für die Antworten.
Schade, dass dies nirgends in meinem Büchlein erwähnt wurde, zumindest noch nicht (Beginning OpenGl - Game Programming 2nd Edition).

Bezüglich der Literatur noch eine Frage:
Gibt es neben dem OrangeBook ein empfehlenswerts Buch mit Hauptaugenmerk auf GLSL welches auch relativ aktuell ist?
Ich finde es überaus verwirrend Bücher zu lesen die auf OpenGL 1.1 Bezug nehmen und dies dann später wieder alles us dem Kopf zu schmeissen um sich mit aktuellen Techniken zu befassen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Okt 14, 2010 08:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Gibt es neben dem OrangeBook ein empfehlenswerts Buch mit Hauptaugenmerk auf GLSL welches auch relativ aktuell ist?

Als Einstieg in GLSL kann ich dir das GLSL Tutorial hier im Wiki empfehlen. Für alles weitere schaust du dir die GLSL Spezifikation in der gewünschten Version an. Für Tricks was man im Shader alles so anstellen kann empfiehlt sich die Shadersammlung.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.065s | 17 Queries | GZIP : On ]