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

Aktuelle Zeit: Sa Jul 05, 2025 14:49

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: VBO + blending per Fragment Shader
BeitragVerfasst: Do Mai 24, 2012 21:08 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Hi zusammen,

das eine oder andere Tutorial hab ich nun hinter mir...

Mit Shadern allgemein bin ich noch immer nicht so wirklich warm geworden, kann aber immerhin Shader laden und benutzen, allerdings hapert es am richtigen Ansatz...

Meine ersten Versuche waren ein Terrain mit unterschiedlichen (einzelnen) Texturen was auch ansich schon ganz gut aussah, aber doch alles in allem recht kompliziert umzusetzen war, zumal ich noch per glBegin()/glEnd() gezeichnet habe...

Ich habe nun folgendes Problem,
inzwischen habe ich mir So allerhand Klassen und Funktionen aufgebaut die hoffentlich etwas bringen.

Ich nutze nun Statische Objecte die ich aus einem (erstmal testweise) eigenen Format direkt in ein VBO 'mappe?'/schreibe und behalte nur noch andere wichtige infops wie Min/Max für BoundingBox/Frustum tests ect...

Derzeit benutze ich die einfachste (GL_T2F_V3F) Klasse
Und ansich funktioniert alles super, mein Terrain wird fix gerendert nur bisher noch ohne
blending was natürlich blöd aussieht (ausser ich wollte vielleicht ein Schachspiel basteln :D)

Wie könnte ich per Shader und VBO (ohne oder besser noch möglichst gar keine uniform sachen...)
das blending meiner einzelnen Tiles realisieren?

Ach noch was wichtiges, dieses mal benutze ich nur eine einzelne Textur für mein Terrain (derzeit 400x400 a 100x100 texturen) mit 16 texturen bzw 15, das 16. soll die blending textur sein/werden
Somit haben also alle Texturen die selbe ID aber andere TexCoords...

Vielen Danke schonmal im Vorraus :)

Gruss

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 21:30 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
In der Shadersammlung findet sich ein wunderbarer Terrain-Shader. Zwar macht der Vertexshader da ein wenig magic....kannst du ignorieren. Übernehme einfach den Fragmentshader:

Code:
  1. uniform sampler2D layer0;
  2. uniform sampler2D layer1;
  3. uniform sampler2D layer2;
  4. uniform sampler2D alpha;
  5.  
  6. varying vec3 normal;
  7.  
  8. void main()
  9. {
  10.     // compute terrain color
  11.     vec3 tex0 = texture2D(layer0, gl_TexCoord[0].xy).rgb;
  12.     vec3 tex1 = texture2D(layer1, gl_TexCoord[0].xy).rgb;
  13.     vec3 tex2 = texture2D(layer2, gl_TexCoord[0].xy).rgb;
  14.     vec3 a = texture2D(alpha, gl_TexCoord[1].xy).rgb;
  15.     vec3 color = a.r*tex0 + a.g*tex1 + a.b*tex2;
  16.  
  17.     // compute diffuse lighting (directional lightsource only)
  18.     float diffuse = max(dot(gl_LightSource[0].position.xyz, normal), 0.0);
  19.     gl_FragColor = vec4(diffuse * color + gl_LightSource[0].ambient.xyz, 1.0);
  20. }


Also es gibt 3 Texturlayer die jeweils eine kachelbare Textur haben. Also etwa Fels, Sand, Grass, etc. Dann gibt es noch eine große Alpha-Textur die mit ihren RGB-Kanälen steuert wie stark wo welche Textur hinkommt. Sie hat die Eigenschaft das R+G+B immer 1 (bzw. 255) ist. Diese Textur ist z.B. 1024x1024 und spannt sich über das ganze Terrain.


Zitat:
Ach noch was wichtiges, dieses mal benutze ich nur eine einzelne Textur für mein Terrain (derzeit 400x400 a 100x100 texturen) mit 16 texturen bzw 15, das 16. soll die blending textur sein/werden
Somit haben also alle Texturen die selbe ID aber andere TexCoords...

Wie meinst du das genau? Wenn du mehr als die 3 Layer willst könntest du ggf. im Alpha-Kanal der Alpha-Textur steuern welche 3 Texturen benutzt werden sollen. Mit einer zusätzlichen Lookup-Table kannst du 256 vers. Kombinationen von 3 Texturen verwenden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Do Mai 24, 2012 21:52 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Zitat:
Zitat:
Ach noch was wichtiges, dieses mal benutze ich nur eine einzelne Textur für mein Terrain (derzeit 400x400 a 100x100 texturen) mit 16 texturen bzw 15, das 16. soll die blending textur sein/werden
Somit haben also alle Texturen die selbe ID aber andere TexCoords...

Wie meinst du das genau?

Ich wollte mir für das Blending die vielen uniform übergaben ersparen ohne mir viel Gedanken darüber gemacht zu haben...
Daher mal ein Image mit Beispiel wie es im Moment aussieht, wie meine Heightmap/Terrain aufgebaut ist...

Bild

Ein einzelnes Tile ist so aufgebaut

Code:
  1.  
  2.     '1- 2 -3
  3.     '|\ | /|
  4.     '8--0--4
  5.     '|/ | \|
  6.     '7- 6 -5
  7.  


Vielleicht übertrieben? Dachte mir allerdings so muss jedes Dreieck nur maximal 3 Texturen bzw Texturtiles blenden

Nun wollte ich eben gern Die übergänge blenden, wenn ich beispielsweise irgendwo einen Weg habe der an Gras oder Fels grenzt das diese einen
weichen übergang haben...

Und das möglichst um für das Terrain keine extra Object klasse zu schreiben da sie eigentlich recht praktisch sich selbst rendernd ist ^^

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 25, 2012 17:14 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
die vielen uniform übergaben ersparen

Ähm, der obige Shader hat gerade mal 4 Uniforms und das sind alles nur Sampler-IDs. Die musst du nur einmal nach dem linken des Shaders setzen. Ab GLSL 1.2 kannst du Uniforms auch schon direkt im Shader-Code initialisieren:
Code:
  1. uniform sampler2D layer0 = 0;


Zitat:
Vielleicht übertrieben? Dachte mir allerdings so muss jedes Dreieck nur maximal 3 Texturen bzw Texturtiles blenden

Nun Terrains haben normalerweise eine recht hohe Geometrie-Auflösung. Du willst den weichen Übergang daher vermutlich über deutlich mehr als ein Dreieck.

Der Ansatz über die Alpha-Textur hat zudem den Vorteil, dass du diese einfach im Grafikprogramm erstellen/modifizieren kannst. Z.B. wenn du ne Straße haben willst schnappst du dir nen Pinsel und malst sie einfach in den entsprechenden Farbkanal. Du musst dir nicht erst einen eigenen Editor bauen oder du kannst gar vorhandene Editoren nutzen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 25, 2012 21:11 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Ich glaub nun weiss ich wo das Kommunikationsproblem besteht :D

Wenn ich Dich richtig verstanden habe ist die rede davon EINE ganze Textur über das gesamte Terrain zu legen und diese dann zu blenden?

Das war eigentlich nicht das was ich vor hatte, auch wenn dies in den meisten Tutorials so gemacht wird (was ich selten nachvollziehen konnte)

Eventuell wär es ja sogar viel einfacher müsste man mal probieren aber eigentlich war die rede
davon von Tile zu Tile zu blenden.
Das rechteck oben ist nur ein einziges Tile meine gesamte Map besteht derzeit aus 100x100 dieser Tiles
jedes Tile hat seine TexturID... zB Gras, Fels ect.. und nun wollte ich eben die Übergänge eines einzelnen Tiles blenden (falls nötig) daher auch die 8 Dreicke per Tile, da könnte ich praktisch per dreieck mit maximal 3 Texturen blenden und so einen übergang von Gras zu Fels oder im schlimmsten Fall ein einzelnes Gras Teil inmitten von Felsiger Landschaft überblenden ohne das ich halt Schachbrettkanten habe...

Die Methode mit einer ganze Heightmaptextur werd ich aber wohl mal ausprobieren und sehen wie es wirkt

Das ganze soll (wenn es je soweit kommt :D) mal ein kleines RPG werden...

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Mai 25, 2012 22:34 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wenn ich Dich richtig verstanden habe ist die rede davon EINE ganze Textur über das gesamte Terrain zu legen und diese dann zu blenden?

Jein ;)

Die Alpha-Textur wird über das gesamte Terrain gespannt. Die Layer-Texturen werden gekachelt, entsprechen also ungefähr deinen Tiles. Du brauchst zwei Sets von Texcoords. (Idealerweise speicherst du diese nicht mit, sondern erzeugst du diese on-the-fly im Vertexshader.)

Würde man die Layer-Texturen über das gesamte Terrain spannen könnte man gleich alles in einer Textur haben und könnte sich das ganze geblende sparen. Allerdings, bei vernünftiger Texturauflösung würde das viel zu viel Speicher brauchen. Ich glaube bei dem Screenshot im Wiki-Artikel hatte ich 32x32 Tiles, jeweils mit einer Auflösung von 1024x1024. Das wäre eine Textur von 3 GB! Jedes Tile hat dabei 65x65 Vertices (also 64*64*2 Dreiecke)

Die Alpha-Textur kann deshalb über das Terrain gespannt werden weil sie nur eine relativ geringe Auflösung braucht.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mai 27, 2012 23:36 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Hab mich nu gestern mal ran gesetzt und nach einigem lesen im umgang mit shadern ein Vertex und Fragment shader geschrieben (oder besser versucht zu schreiben) der (vermutlich nicht toll) meine
Zwecke erfüllen sollte...

leider folgene log: (Edit: Vertex Shader etwas ausgebessert)
Zitat:
Shader:
Vertex shader failed to compile with the following errors:
ERROR: 0:58: error(#202) No matching overloaded function found If
ERROR: 0:59: error(#132) Syntax error: '{' parse error
ERROR: error(#273) 2 compilation errors. No code generated

Shader:
Fragment shader failed to compile with the following errors:
ERROR: 0:3: error(#205) Cannot initialize this type of qualifier uniform
ERROR: 0:5: error(#132) Syntax error: 'In' parse error
ERROR: error(#273) 2 compilation errors. No code generated


Die Idee dahinter war, ich übergebe dem Vertexshader per VBO 6 floats bzw 2 vec3
die erste soll die position XYZ sein, die 2. vergewaltige ich um 3 ID's festzuhalten die
ich dann entsprechend auswerte und anhand der IDs 2 TexCoords bzw 3 mit einer Alpha die aber immer die selbe ist an den Fragment Shader übergebe...
Der Fragment Shader soll dann anhand der 3 TexCoords das Blending übernehmen..
Und das ganze mit der Aktuell gebundenen Textur, und das dann ganz ohne echtem Uniform...

Vielleicht... wenn mal einer einen Blick auf meine Shader werfen könnte?!

Vertex Shader
(Edit: Konnte ein paar kleinere Fehler inzwischen ausbessern, aber bei einer If/Then in der Function meckert er immer, mit google find ich dazu nichts auch hier ist das GLSL Tutorial bzgl. If/Then SEHR mager (kein einziges beispiel...) ist and, or überhaupt erlaubt (hab schon ohne probiert, selbe fehler))

Code:
  1.  
  2. #version 150
  3.  
  4. // Variablen zum Zugriff auf die im Vertexbuffer gespeicherten Daten:
  5. layout(location = 0)  in vec3 VertexPos;
  6. layout(location = 1)  in vec3 BlendCode;
  7.  
  8. //BlendCode.r = Vertex_ID
  9. //BlendCode.g = BaseTex_ID
  10. //Blendcode.b = BlendTo_ID
  11.  
  12. out vec2 BaseTexture;
  13. out vec2 BlendToTexture;
  14. out vec2 AlphaTexture;
  15.  
  16. void GetTexCoord(in vec3 IDCode, out vec2 BaseTexture, out vec2 BlendToTexture)
  17. {
  18.     //'1- 2 -3
  19.     //'|\ | /|
  20.     //'8--0--4
  21.     //'|/ | \|
  22.     //'7- 6 -5
  23.  
  24.     int Vertex_ID;    
  25.  
  26.     int BASE_ID;
  27.     int COL_BASE;
  28.     int ROW_BASE;
  29.  
  30.     int BLEND_ID;
  31.     int COL_BLEND;
  32.     int ROW_BLEND;
  33.  
  34.     float XCoord[2];
  35.     float YCoord[2];
  36.  
  37.     Vertex_ID = int(IDCode.r * 100);
  38.  
  39.     BASE_ID   = int(IDCode.g * 100);
  40.     ROW_BASE  = BASE_ID / 4;
  41.     COL_BASE  = BASE_ID - (ROW_BASE * 4);
  42.  
  43.     BLEND_ID  = int(IDCode.b * 100);
  44.     ROW_BLEND = BLEND_ID / 4;
  45.     COL_BLEND = BLEND_ID - (ROW_BLEND * 4);
  46.  
  47.  
  48.     XCoord[0] = float(COL_BASE * 0.25);
  49.     YCoord[0] = float(1.00 - (ROW_BASE * 0.25));
  50.  
  51.     XCoord[1] = float(COL_BLEND * 0.25);
  52.     YCoord[1] = float(1.00 - (ROW_BLEND * 0.25));
  53.  
  54.     AlphaTexture.x = 0.75;
  55.     AlphaTexture.y = 0.00;
  56.  
  57.  
  58.     If (Vertex_ID == 2 || Vertex_ID == 0 || Vertex_ID == 6)
  59.     {
  60.         XCoord[0] += 0.125;
  61.         XCoord[1] += 0.125;
  62.         AlphaTexture.x = 0.875;
  63.     }
  64.  
  65.     If (Vertex_ID == 3 || Vertex_ID == 4 || Vertex_ID == 5)
  66.     {
  67.         XCoord[0] += 0.249;
  68.         XCoord[1] += 0.249;
  69.         AlphaTexture.x = 1;
  70.     }
  71.  
  72.  
  73.     If (Vertex_ID == 8 || Vertex_ID == 0 || Vertex_ID == 4) {
  74.     YCoord[0] -= 0.125;
  75.     YCoord[1] -= 0.125;
  76.         AlphaTexture.y = 0.125; }
  77.  
  78.     If (Vertex_ID == 7 || Vertex_ID == 6 || Vertex_ID == 5) {
  79.     YCoord[0] -= 0.249;
  80.     YCoord[1] -= 0.249;
  81.     AlphaTexture.y = 0.25;  }
  82.  
  83.     BaseTexture.x = XCoord[0]
  84.     BaseTexture.y = YCoord[0]
  85.  
  86.     BlendTexture.x = XCoord[1]
  87.     BlendTexture.y = YCoord[1]
  88. }
  89.  
  90. void main()
  91. {
  92.     GetTexCoord (BlendCode, BaseTexture, BlendToTexture)
  93.     gl_Position    = VertexPos;
  94. }
  95.  
  96.  


Fragment Shader
Code:
  1.  
  2. #version 150
  3.  
  4. uniform sampler2D TextureSet = 0;
  5.  
  6. In vec2 BaseTexture;
  7. In vec2 BlendToTexture;
  8. In vec2 AlphaTexture;
  9.  
  10. void main(void)
  11. {
  12.  vec3 BaseRGB  = texture2D( TextureSet, BaseTexture );
  13.  vec3 BlendRGB = texture2D( TextureSet, BlendToTexture );
  14.  vec3 AlphaRGB = texture2D( TextureSet, AlphaTexture );
  15.  
  16.  gl_FragColor  = mix(BaseRGB, BlendRGB, Alpha.r);
  17.  
  18.        
  19. }
  20.  

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 03:34 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Aug 18, 2007 18:47
Beiträge: 694
Wohnort: Köln
Programmiersprache: Java
alle keywords in glsl fangen mit einem kleinen buchstaben an.
so auch das if.

_________________
Es werde Licht.
glEnable(GL_LIGHTING);
Und es ward Licht.


Zitat aus einem Java Buch: "C makes it easy to shoot yourself in the foot; C++ makes it harder, but when you do it blows your whole leg off"

on error goto next


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 04:09 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Hab ich nach stunden langen durchtesten inzwischen festgestellt, beide shader werdden mir zumindest inzwischen ohne fehler kompiliert ... das ergebnis ist nur leider das ich nichts sehe...

Wie kommen meine Daten denn im VertexShader an?
bringt es überhaupt was wenn ich am anfang
Code:
  1.  
  2. in  vec3 in_Color;
  3. in  vec3 in_Position;
  4.  

benutze um damit arbeiten zu wollen?

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 08:59 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du musst ihm mit glVertexAttribPointer sagen wo was liegen soll. Denke daran die Attribute auch mit glEnableVertexAttribArray zu aktivieren.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 12:05 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Danke, das werd ich mir wohl später noch genauer ansehen müssen wenn ich ein wirklich 'neues' eigenes Format habe...

den Test hab ich aber nun mit...
Code:
  1.  
  2.     glInterleavedArrays(GL_C3F_V3F, SizeOf(testtype), NULL)
  3.     glDrawArrays(GL_TRIANGLES, 0, 3)
  4.  

...gerendert

Zur fehlersuche alles abgespeckt bzw rausgenommen...

Mein Vertexshader:
Code:
  1.  
  2. //#version 150
  3.  
  4. in vec3 in_Color;
  5. in vec3 in_Position;
  6.  
  7. void main()
  8. {
  9.  
  10.     //gl_Color = vec4(in_Color.r,in_Color.g,in_Color.b,1.0);
  11.     //gl_Color = vec4(1.0,1.0,1.0,1.0);
  12.     gl_Position = gl_ModelViewProjectionMatrix * vec4(in_Position.x,in_Position.y,in_Position.z,1.0);
  13.  
  14. }
  15.  


gerade dazu genommen auch einen neuen Fragmentshader:
Code:
  1.  
  2. //#version 150
  3.  
  4. void main()
  5. {
  6.     gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
  7. }
  8.  

nur um zu sehen ob überhaupt was mit der Farbe passiert...

Denn sobald ich im Vertexshader per gl_Color etwas mache wird mir (scheinbar?) nichts mehr gezeichnet...
ohne Fragmentshader und ohne gl_Color im Vertexshader zeichnet er mir scheinbar zufällig alles kunterbund...
nett anzusehen das bunte geblinke aber nicht wirklich was ich möchte ^^

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 12:50 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
  • gl_Color darf nur gelesen werden. Vermutlich wolltest du gl_FrontColor benutzen?
  • glInterleavedArrays nicht in Verbindung mit selbst definierten Attributen benutzen. Im Falle des Formates GL_C3F_V3F findet sich die Vertexposition in gl_Vertex und die Farbe in gl_Color.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 16:08 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
Vielen Dank,

ich konnte nun zwar mit den Positions und Farbdaten in den Shadern arbeiten, brachte aber leider
nicht das von mir vorgestellte Ergebnis :/

Kann es sein das der Fragmentshader bei einer durch eine im shader berechneten Texturkoordinate
deswegen längst nicht Textuiert?

Ich habe zwar die richtige Textur und auch farblich stimmt alles, aber egal wie ichs mach, er macht mir nur eine art farbverlauf aus den an den koordinaten befindlichen Farben, aber nach der Textur die sich da befindet sieht das ganze nicht aus...

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 21:06 
Offline
DGL Member

Registriert: Mi Mai 23, 2012 08:09
Beiträge: 32
Wohnort: Karlsruhe
Programmiersprache: FreeBASIC
So, letzter Versuch und letzte Frage...

Hab nun alles umgebaut

Mappe mir meine Daten nun wie hier im VBO Tutorial, habe aber versucht das ganze mit entsprechend mehr daten zu versuchen...
jetzt wollte ich 3 paare Texture koordinaten nutzen... die daten ansich funktionieren auch (jedenfalls ohne shader)
allerdings nimmt er auch dann die zuletzt angegebenen Texturkoordinaten und nicht wie erwartet die ersten..

Wie nun aber gehen die daten in die Shader und wie verarbeite ich sie dort weiter??

bekomme nur ein Gelbes dreieck obwohl kein bisschen Gelb in meiner Textur ist

Kann ich überhaupt 3 paare texturkoordinaten übergeben und sie auch nutzen?!

mein Rendercode sollte trotz Fremdsprache eigentlich verständlich sein:
Code:
  1.  
  2.     glClear  GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT    
  3.     glLoadIdentity()
  4.    
  5.     VBO.glBindBuffer(GL_ARRAY_BUFFER, VBOID)
  6.     glVertexPointer(3, GL_FLOAT, STRIDE, cast(any ptr,POS_OFFSET))
  7.     glColorPointer(3, GL_FLOAT, STRIDE, cast(any ptr,COL_OFFSET))
  8.     glTexCoordPointer(2, GL_FLOAT, STRIDE, cast(any ptr,TEX1OFFSET))
  9.     glTexCoordPointer(2, GL_FLOAT, STRIDE, cast(any ptr,TEX2OFFSET))
  10.     glTexCoordPointer(2, GL_FLOAT, STRIDE, cast(any ptr,TEX3OFFSET))
  11.  
  12.     VBO.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexID)
  13.  
  14.     glEnableClientState(GL_VERTEX_ARRAY)
  15.     glEnableClientState(GL_COLOR_ARRAY)
  16.     glEnableClientState(GL_TEXTURE_COORD_ARRAY)
  17.    
  18.     glDrawElements(GL_TRIANGLES,IndexCount,GL_UNSIGNED_SHORT,NULL)
  19.  
  20.     glDisableClientState(GL_TEXTURE_COORD_ARRAY)
  21.     glDisableClientState(GL_COLOR_ARRAY)
  22.     glDisableClientState(GL_VERTEX_ARRAY)
  23.    
  24.     VBO.glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0)    
  25.     VBO.glBindBuffer(GL_ARRAY_BUFFER, 0)


mein Vertexshader:
Code:
  1.  
  2. #version 150
  3.  
  4. in vec3 in_Position;
  5. in vec3 in_Color;
  6. in vec2 in_Tex1;
  7. in vec2 in_Tex2;
  8. in vec2 in_Tex3;
  9.  
  10. out vec2 BaseTextureCoords;
  11. out vec2 BlendTextureCoords;
  12. out vec2 AlphaTextureCoords;
  13.  
  14. void main()
  15. {
  16.     BaseTextureCoords  = in_Tex1;
  17.     BlendTextureCoords = in_Tex2;
  18.     AlphaTextureCoords = in_Tex3;
  19.  
  20.     gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
  21. }


und der Fragmentshader der offensichtlich nicht so will wie ich:
Code:
  1. #version 150
  2. uniform sampler2D TextureSet;
  3.  
  4. in vec2 BaseTextureCoords;
  5. in vec2 BlendTextureCoords;
  6. in vec2 AlphaTextureCoords;
  7.  
  8. void main()
  9. {
  10.  
  11.     vec4 BaseRGBA  = texture2D(TextureSet, BaseTextureCoords);
  12.     vec4 BlendRGBA = texture2D(TextureSet, BlendTextureCoords);
  13.     vec4 AlphaRGBA = texture2D(TextureSet, AlphaTextureCoords);
  14.  
  15.     gl_FragColor = BaseRGBA;//mix(BaseRGBA, BlendRGBA, AlphaRGBA.r);
  16. }


Edit: da war doch ein gelber pixel, und zwar an 0.0,0.0 daher gehe ich aus das die koordinaten gar nicht an die shader gehen wie sie sollen oder ich bin zu doof sie weiter zu verarbeiten...

wenns nu nimmer klappt nehm ich mir eine fertige engine, macht echt keine freude

_________________
Bild


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Mai 28, 2012 22:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Coolcat hat geschrieben:
glInterleavedArrays nicht in Verbindung mit selbst definierten Attributen benutzen.

Du mischt immer noch alten OpenGL Code (glVertexPointer & Co) mit selbst definierten Attributen im Shader! Entweder auch im Shader das alte Zeug benutzen oder deinen Code auf glVertexAttribPointer umstellen.

Zitat:
Code:
  1. in vec3 in_Position;

Der Shader-Compiler hat keine Ahnung was er damit tun soll. Du hättest das Attribut genauso gut "Foobar252525AB" nennen können...der Compiler sieht da keinen Unterschied. Er weiß nicht das das eine Position sein soll. Das musst du ihm mit glVertexAttribPointer sagen bzw. du sagst ihm wo er die Daten aus dem VBO lesen soll!

Zitat:
Kann ich überhaupt 3 paare texturkoordinaten übergeben und sie auch nutzen?!

Wenn du glTexCoordPointer benutzt (also das alte Zeug) musst du vor jedem Aufruf von glTexCoordPointer einmal glClientActiveTexture aufrufen um die gewünschte Texturunit zu setzen. Siehe auch glActiveTexture was du in jedem Fall (alt oder neu) brauchst um die Texturen zu binden.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 19 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 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.011s | 15 Queries | GZIP : On ]