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

Aktuelle Zeit: Mi Jul 16, 2025 01:33

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Jun 28, 2007 18:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 28, 2007 16:40
Beiträge: 7
Hallo Forum,
hmm.. ich glaube es ist passender hier zu posten als im "normalen" OpenGL Forum...(?)

Ich programmiere unter Linux in C++, benutze die Cg Runtime und habe eine GeForce4Ti, Treiber Version ist 8776.

Also vereinfacht gesagt ist es mein Ziel, eine Tube (also quasi einen Zylinder) per VBO an die Graka zu übergeben. In dem VBO habe ich die Koordinaten, die Farbe und die Normale für jeden Vertex gespeichert.

Anfangs haben je zwei aufeinander folgende Vertices die gleichen Koordinaten, aber von diesen je zwei Vertices hat einer den alpha Wert Null und der andere 1. Mein arbvp1 Vertex Shader erkennt das und schiebt den einen Vertex etwas nach "oben" und den anderen nach "unten". Alle aufeinander folgenden Vertices ergeben so einen Quad Strip. Das klappt so weit auch sehr gut (hoffe habe mich verständlich ausgedrückt).

Ein Detail (um Fragen zuvor zu kommen), das aber für eine Lösung meines Problems unwichtig sind: der Shader erhält als uniform Parameter die Position der Kamera. Außerdem dient die Normale eines Vertex als Parameter, der die Position des nächsten Vertex kodiert. So kann ich die Richtung berechnen, die nach "oben" zeigt:
"oben" = kreuzprodukt ( (kameraposition - vertexposition) , (normale - vertexposition) )

Dazu der Vertex Shader (Cg):

Code:
  1.  
  2. struct VertexInput
  3. {
  4.   float3 position       : POSITION;
  5.   float4 color          : COLOR0;
  6.   float3 next           : NORMAL;
  7. };
  8.  
  9. struct VertexOutput
  10. {
  11.   float4 position       : POSITION;
  12.   float4 color          : COLOR0;
  13.   float  texCoord       : TEXCOORD0;
  14. };
  15.  
  16. VertexOutput main( VertexInput IN,
  17.                    uniform float4x4 ModelViewProj,
  18.                    uniform float3 viewPos,
  19.                    uniform float radius
  20.                  )
  21. {
  22.         VertexOutput OUT;
  23.  
  24.         float3 up  = normalize( cross( (viewPos - IN.position), (IN.next - IN.position) ) );
  25.                up *= radius;
  26.  
  27.        if (IN.color.a == 0)
  28.        {
  29.            OUT.position.xyz = IN.position - up;
  30.            OUT.texCoord = 0;
  31.        }
  32.        else
  33.        {
  34.            OUT.position.xyz = IN.position + up;
  35.            OUT.texCoord = 1;
  36.        }
  37.  
  38.        OUT.position.w = 1;
  39.        OUT.position   = mul( ModelViewProj, OUT.position );
  40.  
  41.        OUT.color.xzy = IN.color.xzy;
  42.        OUT.color.a   = 1;
  43.  
  44.        return OUT;
  45. }
  46.  


So, damit nun der Eindruck eines 3dimensionalen Zylinders entsteht, möchte ich die Quads mit einer 1dimensionalen Luminance Map shaden, dafür kriegt der eine von diesen je zwei Vertices die Texturkoordinate Null und der andere 1. Die Luminance Map besteht aus unsigned bytes, bis zur Hälfte der Textur steigen die Werte von 0 bis 255, und ab der Hälfte sinken sie von 255 nach 0.

Dafür habe ich einen fp20 Fragment Shader geschrieben:

Code:
  1.  
  2. struct FragmentInput
  3. {
  4.   float4 color          : COLOR0;
  5.   float  texCoord       : TEXCOORD0;
  6. };
  7.  
  8.  
  9. float4 main( FragmentInput IN,
  10.              uniform sampler1D lumiMap
  11.              ) : COLOR
  12. {
  13.         float luminance = tex1D(lumiMap, IN.texCoord).r;
  14.  
  15.         float4 OUT;
  16.  
  17.         OUT.rgb = IN.color.rgb * luminance;
  18.  
  19.         OUT.a   = 1;
  20.  
  21.         return OUT;
  22. }
  23.  


Wenn ich den nun laufen lasse, bleibt die gesamte Szene schwarz.

Sorry wenn ich euch jetzt mit Fragen überhäufe, aber ich mach einfach mal ein kurzes Brainstorming....:

1. In einem anderen Post habe ich gelesen, dass man den Fragment Shader an den Vertex Shader "binden" muss? Das verstehe ich nicht. Die sind doch automatisch durch die Ein- und Ausgabesemantiken verbunden?

2. Muss ich mit glActiveTexture TextureUnits aktivieren? Hat zu keinen Ergebnissen geführt, außer dass dann Fehlermeldungen vom VBO kommen (glBindBufferARB(): invalid enumerant).

3. glEnable(GL_TEXTURE_1D), glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE), habe ich mit rumexperimentiert, hat aber nichts geändert.

4. Kann es sein, dass 2. und 3. nur gemacht werden muss, wenn ich keinen eigenen Frag. Shader benutze? Das habe ich auch versucht, dann bleibt die Szene zwar nicht schwarz, aber der ganze Quad Strip ist dann flat geshadet in den Farben die im VBO übergeben werden (also nix von wegen Luminance Map funktioniert)

5. Ich kann mich erinnern, dass ich mal gelesen habe, dass im fp20 (= texture_shader + register_combiner) nur Texturkoordinaten genutzt werden können, die an den Frag. Shader übergeben wurden und nicht solche, die dort online generiert wurden. Es müsste aber doch trotzdem erlaubt sein, die Text.koordinaten im Vertex Shader zu generieren? Muss ja eigentlich.... aber ich weiß einfach nicht mehr weiter.....


Wichtig noch: Es ist nicht mein Ziel, einen eigenen Shader zu benutzen, eigentlich sogar im Gegenteil, ich würde das lieber durch OpenGL machen lassen damit es auf möglichst vielen Systemen läuft. Hauptsache, es funktioniert überhaupt.


Bitte fragt mich, wenn ich irgendwas nicht gut erklärt habe oder Infos fehlen! Ich bin für jede Hilfe dankbar!


So, Grüße und vielen Dank schon mal wenigstens fürs Lesen dieses langen Posts.....


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Jun 29, 2007 08:04 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
fireandice91 hat geschrieben:
2. Muss ich mit glActiveTexture TextureUnits aktivieren? Hat zu keinen Ergebnissen geführt, außer dass dann Fehlermeldungen vom VBO kommen (glBindBufferARB(): invalid enumerant).


Ich glaube, da hast du was falsch verstanden. glActiveTexture legt fest, welche Textureinheit die folgenden Befehle beeinflussen sollen. Wenn du also die Texture bla an die erste Unit binden willst, während du die Textur blubb and die zweite Binden willst, machst du das wie folgt:
Code:
  1.  
  2.   glActiveTexture(GL_TEXTURE0); // Erste Einheit auswählen
  3.   glBindTexture(GL_TEXTURE_2D, bla); // Textur an aktuell gewählte Einheit binden
  4.   glActiveTexture(GL_TEXTURE1); // Zweite Einheit auswählen
  5.   glBindTexture(GL_TEXTURE_2D, blubb); // Textur an aktuell gewählte Einheit binden
  6.   glActiveTexture(GL_TEXTURE0); // Wieder zur ersten zurückschalten.
  7.  


Auch andere Texturaufrufe, wie glTexParameter, beeinflussen die Textur in der aktuellen Textureinheit.

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 29, 2007 12:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 28, 2007 16:40
Beiträge: 7
Hi Lord,
danke für die Antwort. Ja, das hatte ich nicht richtig verstanden. Habs korrigiert und auch die Sache mit der VBO Fehlermeldung beseitigen können, aber mache wohl noch an anderen Stellen Fehler (läuft immer noch nicht)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 29, 2007 13:16 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
fireandice91 hat geschrieben:
3. glEnable(GL_TEXTURE_1D), glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE), habe ich mit rumexperimentiert, hat aber nichts geändert.

4. Kann es sein, dass 2. und 3. nur gemacht werden muss, wenn ich keinen eigenen Frag. Shader benutze? Das habe ich auch versucht, dann bleibt die Szene zwar nicht schwarz, aber der ganze Quad Strip ist dann flat geshadet in den Farben die im VBO übergeben werden (also nix von wegen Luminance Map funktioniert)


Also glTexEnv / glTexParameter aufrufe werden in Fragment-Shader nicht gebraucht. glEnable solltest du afaik dennoch verwenden, genauso wie glBindTexture.

Ich kenne mich leider nicht mit Cg aus, daher kann ich dir da nicht helfen. Aber mit GLSL müsste das ja auch gehen, oder?

Gruß Lord Horazont

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jun 29, 2007 14:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 28, 2007 16:40
Beiträge: 7
Da hast du schon recht, und ich würde es auch lieber benutzen, aber ich arbeite an einer Bibliothek zur wissenschaftlichen Visualisierung die nicht von mir geschrieben wurde, und da darf ich nur Cg benutzen....


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jul 01, 2007 11:07 
Offline
DGL Member
Benutzeravatar

Registriert: Do Jun 28, 2007 16:40
Beiträge: 7
Problem gelöst.

Ich muss
Code:
  1.  
  2. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  3. glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  4.  

setzen (oder GL_LINEAR, egal, Haupsache irgendwas), sonst bleibt der Bildschirm schwarz. Ich dachte, GL_LINEAR wäre der default? Mit anderen Worten, dort existiert ein default Wert? Kann natürlich auch daran liegen, dass an einer anderen Stelle in der Software, an der ich arbeite, irgendwas rumgemurkst wird...

glEnable(TEXTURE_1D) und glBindTexture brauche ich definitiv nicht. Ich habe allerdings einen Befehl aus der Cg Runtime gefunden, der heißt cgGLSetManageTextureParameters und managed die Texturen automatisch, vielleicht deswegen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 03, 2007 15:37 
Offline
DGL Member
Benutzeravatar

Registriert: So Jun 04, 2006 12:54
Beiträge: 263
Wenigstends der Min filter m,uss gesetzt werden. Dort gibt es keinen default wert....


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast


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.008s | 16 Queries | GZIP : On ]