[OpenGL] Textur-Rauschen

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
joggel

[OpenGL] Textur-Rauschen

Beitrag von joggel »

Guten Tag,

ich wollte ein Rauschen wie bei einem Fernseher mittels Shader realisieren.
Dazu habe ich mir eine RauschTextur mittels Gimp generiert.

Ich habe mir das so vorgestellt, dass ich die Texturkoordinaten bei jedem Frame neu übergebe (bei mir sogr zufällig).
Also bei jedem Frame neue Texturkoordinaten für die Rausch-Textur an den Shader übergeben.
Jedoch sehe ich dabei jetzt nur noch eine graue Textur...#

Ich poste mal etwas Code, damit es deutlich wird.

Code: Alles auswählen

	GLint uvNoiseTexTempID = glGetUniformLocation(mShader.mProgramID, "uvNoiseTexTemp");
	float val1 = float(rand() % 100) /100.0f;
	float val2 = float(rand() % 100) / 100.0f;
	glUniform2f(uvNoiseTexTempID,val1, val2 );
Und im VertexShader:

Code: Alles auswählen

#version 330 core
out vec2 uvNoiseTex;
uniform vec2 uvNoiseTexTemp;

void main()
{
  gl_Position.xy = vertexPosition.xy;
  gl_Position.z = 1.0;
  gl_Position.w = 1.0;
  uvNoiseTex = uvNoiseTexTemp;
}
Fragmentshader:

Code: Alles auswählen

in vec2 uvNoiseTex;
uniform sampler2D noiseTextureSampler;
vec4 colNoise;

// Ouput data
out vec4 color;

void main()
{
  colNoise = texture2D( noiseTextureSampler, uvNoiseTex ).rgba;
  color = colNoise;
}
Aber wie gesagt, ich sehe nur eine grau Textur, was mich etwas wundert. Würde ich nix sehen, dann wüsste ich das ich etwas falsch gemacht habe. Aber eine GRAUE Textur?!?!

Weiß jemand etwas?
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von xq »

Grau klingt nach mipmapping. Sample mal mit texture2Dlod aus der Textur, nimm dafür die 0te mip-ebene.
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Ebenfalls grau... :-/
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von Schrompf »

Du benutzt über den kompletten Bildschirm hinweg die selben Texurkoordinaten. Demzufolge samplet der Shader immer von der selben Stelle der Textur, egal wo auf dem Bildschirm er gerade arbeitet. Entweder Du gibst ihm vier Ecken mit jeweils Offset (0,0), (1,0), (0,1), (1,1) als Vertexattribute, oder Du berechnest die aus der VertexID.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Ah, okay. Verstehe.
Würde das denn auch funktionieren, wenn ich die 4 Texturkoordinaten an den Vertexsahder übergebe und aus diesen dann im Vertexshader ermittel welchen Wert ich als uv-koordinate an den Fragmentshader übergeben muss?

Bzw:
oder Du berechnest die aus der VertexID.
Und wie geht das?
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von Schrompf »

https://www.opengl.org/wiki/Built-in_Variable_(GLSL)

In gl_VertexId steht halt der Index des aktuellen Vertex drin. Ohne IndexBuffer beginnt der bei 0 und geht 0, 1, 2 für Dein erstes Dreieck, 3, 4, 5 für Dein zweites Dreieck, usw. Wenn Du einen IndexBuffer benutzt, steht da drin der Index des aktuellen Vertex. Daraus kannst Du dann die Ecke berechnen, wo auf der Textur die aktuelle Bildschirmecke lesen soll.

Wobei ich gerade aus Deinem Shader lese, dass der sehr wohl ein Vertexattribut liest, nur ist das nirgends als Input deklariert. Dass der überhaupt kompiliert, wundert mich gerade. Aber immerhin bedeutet das, dass Du ja schon die Vertexposition da hast. Das muss dann eine vortransformierte Vertexpositionen sein, und die liegen für xy ja im Bereich (-1 ... +1). Also könntest Du auch ganz einfach die benutzen und Dir ein bisschen zurechtskalieren.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Doch, sie sind deklariert, ich habe die nur nicht hier gepostet:
layout(location = 0) in vec3 vertexPosition;

Na ich werde es mal probieren...
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Okay, ich habe jetzt ne lösung gefunden.
Jedoch ist es eine etwas "dreckige" Lösung^^

Ich benutze ganz normal fixe Texturkoordinaten für das Bild. Also (0,0)...(1,1).
Überegebe sie den Vertexshader.
dann generiere ich pro Frame zufällig einen 2d-vektor, übergebe den an den Vertexshader.
Diesen vec2 von der fixen Texturkoordinate abziehen.
Das rauschen funktioniert.

Nachteil ist natürlich, dass ich beim 0. Vertext dann negative TexturKoordinaten erhalte... aber hier geht das eben mal.
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von xq »

ist eigentlich die schöne lösung. und anstatt abziehen einfach mal addieren und das ergebnis mit lustigen faktoren multiplizieren, dann sollte das ergebnis ein bisschen besser werden
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von Krishty »

Je nachdem, ob du Shader Model 4 zur Verfügung hast, kannst du das Rauschen auch direkt im Shader erzeugen statt eine Textur zu benutzen. Hat den Vorteil, dass es noch zufälliger ist (keine Wiederholungen) und du keine weitere Ressource pflegen musst:

http://old.zfx.info/DisplayThread.php?TID=24491 (in der Mitte des Threads ist der Code; konvertier von HLSL zu GLSL)

Das verdammte ImageShack hat die Bilder gelöscht; naja, ich habe es hier rechts bei den Sternen eingesetzt:

Bild
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Ja, sowas habe ich auch irgendwo gelesen, dass man Rauschen auch direkt im Shader erzeugen kann.
Für meinen Zweck reicht das auch, wenn ich das so "billig" mache... wobei das mit der extra Textur dafür schon etwas umständlich ist.

Ich zeige euch mal für was ich das gebraucht habe :P

Will das nur mal schnell aufnehmen und bearbeiten...
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

So, habe es mal aufgenommen.
Man achte bitte nicht auf die Musik, da sie lediglich durch die kräftige Bassline gut dafür geeignet ist um visuell darauf zu reagieren :D
ist nicht jedermanns geschmack, aber für diese zwecke reicht es.

Auch das TV-Gerät sieht irgendwie nicht sooo toll aus, und beißt sich auch irgendwie mit dem Hintergrund...

http://www.vidup.de/v/bbj1a/

Okay, bissl albern... aber egal^^
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von Krishty »

Sehr schick!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Danke :)

Wollte eigentlich noch mehr auf die Audiodaten reagieren.
Vlt. irgendwie im Tak das Bild verzerren oder so... na mal sehen ob ich das noch hinbekomme...
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [OpenGL] Textur-Rauschen

Beitrag von xq »

Cool cool!
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
joggel

Re: [OpenGL] Textur-Rauschen

Beitrag von joggel »

Ich muss aber sagen, dass das in dem Video noch etwas "schmutziger" wirkt, durch die schlechte Vido- und Audioaufnahmequalität.
Deshalb wirkt das irgendwie etwas runder als hier bei mir in echtzeit.
Vlt kann ich das im programm etwas so anpassen.
Schlechtere Soundqualität und vlt. noch so etwas wie ein shader der das etwas alt und schmutzig wirken lässt....
Antworten