Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

08.01.2011, 19:50

Problem mit "uniform int" in GLSL

Hi,
aus irgend einem Grund will OpenGL nicht, dass ich eine integer uniform in meinem OpenGL shader verwende. Beim Kompilieren des Shaders wird weder ein Fehler noch eine Warnung ausgeworfen.
Der integer uniform ist auch definitiv Teil der Shader Constant-List. Aber sobald ich diese uniform verwenden will, wird einfach der gesammte Shader nicht angewendet?!
Das ist mein Shader (BloomEffekt):

C-/C++-Quelltext

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
31
32
33
34
35
36
37
38
39
40
41
42
43
#version 120

uniform sampler2D Tex;

uniform vec2 DownSampleOffsets[16];
uniform vec2 BlurOffsets[9];
uniform float BlurWeights[9];

uniform int RenderPass;

#define PASS_DOWNSAMPLE 0
#define PASS_BLUR_HORZ  1
#define PASS_BLUR_VERT  2

void main()
{
    vec3 Sum = vec3(0.0);
    
    if (RenderPass == PASS_DOWNSAMPLE) // Wenn ich diese Zeile auskommentiere, wird der Shader angewendet. So wie es hier steht wird der Shader komplett nicht verwendet.
    {
        for (int i = 0; i < 16; ++i)
            Sum += texture2D(Tex, gl_TexCoord[0].xy + DownSampleOffsets[i]).rgb;
        
        Sum *= (1.0 / 16.0);
    }
    else if (RenderPass == PASS_BLUR_HORZ)
    {
        for (int i = 0; i < 9; ++i)
            Sum += texture2D(Tex, gl_TexCoord[0].xy + vec2(BlurOffsets[i].x, 0.0)).rgb * BlurWeights[i];
        
        //Sum * GaussianMultiplier;
    }
    else if (RenderPass == PASS_BLUR_VERT)
    {
        for (int i = 0; i < 9; ++i)
            Sum += texture2D(Tex, gl_TexCoord[0].xy + vec2(0.0, BlurOffsets[i].y)).rgb * BlurWeights[i];
        
        //Sum * GaussianMultiplier;
    }
    
    gl_FragColor.rgb    = Sum;
    gl_FragColor.a      = 1.0;
}

Ich dachte schon es könnte an den uniform arrays liegen, weil sich dann die Register-Indices der uniforms verändert, aber wenn ich die komplett raus nehme, habe ich das selbe Problem.
Ich kann mir nicht erklären woran das jetzt liegt. Hab auch schon etwas länger dran rumgeschraubt, is aber nix zu machen.
Hat jemand eine Idee woran das liegen kann?!

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

08.01.2011, 22:20

Bedeutet "komplett nicht verwendet" dass der Shader tatsächlich ohne einen Fehler zu verursachen ignoriert wird? Denn das wäre wohl ein Bug im Treiber? Oder verhält sich alles einfach nur so als würden die ganzen branches übersprungen? Funktioniert es denn mit float? Prä D3D10 Hardware unterstützt nativ keine Integerarithmetik, d.h. wenn dann wird dort alles mit float emuliert. Ich wär mir nicht so sicher ob eine Implementation uniform int überhaupt unterstützen muss, vor allem in einer derart niedrigen GLSL version. Ich hatte iirc jedenfalls mal ein ähnliches Problem das sich erst durch die Verwendung von float statt int lösen lies. Ich weiß nicht inwiefern GLSL so etwas wie static branching definiert (offensichtlich willst du ja genau das erreichen). Vielleicht funktioniert es eher wenn du die einzelnen branches mit uniform bool Variablen ein- und ausschaltest!?

Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von »dot« (08.01.2011, 22:31)


LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

09.01.2011, 13:47

Ich hab die aktuellsten Treiber von NVIDIA (260...) und OpenGL 4.1 support sowie DirectX 11. Ich hoffe also, dass es nicht an den Treibern liegt.
Wenn ich jetzt eine höhere Version also 120 nehme (z.B. 150) muss ich den OpenGL Renderer komplett umkrempeln. Ich hab' zwar vor irgend wann einen zweiten OpenGL renderer, mit OGL 3.0 als Basis, zu entwickeln,
aber erst Mal soll der jetzige reichen. Vor allem weil man in OpenGL durch extensions immer wieder auf das alte drauf bauen kann (ob das immer so gut ist mal außer Frage gestellt).
So kann ich z.B. Geometry Shader nutzen und trotzdem bei GLSL 120 bleiben. Ich muss halt immer die extensions auch in den Shadern einbauen (nicht schön, dafür aber selten ^^).

Wenn ich "RenderPass" als float oder boolean schreibe habe ich das selbe Problem. In einigen anderen Shadern die ich mal geschrieben habe (u.a. im ShaderLibrary tutorial meiner Engine) funktioniert das mit "int" wunderbar.
Ich kann mir den Fehler im Moment wirklich nicht erklären. Und ich bin ziehmlich sicher, das der Shader ohne Fehlermeldung ignoriert wird. :(

EDIT:
Ok Problem gelöst :thumbsup:
Ich hab "RenderPass" drei mal verändert aber den Shader nicht neu gebunden. Meine Engine deaktiviert den Shader nach dem setzen von Konstanten wieder.
Danke trotzdem,
Lukas

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

09.01.2011, 15:46

Meine Engine deaktiviert den Shader nach dem setzen von Konstanten wieder.

Wieso denn das?
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Werbeanzeige