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

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

05.08.2013, 14:51

[OpenGL] Depth Texture

hi zusammen,

ich benötige für verschiedene Rendering Techniken meine Tiefenkarte im Fragment Shader.
Dafür mache ich derzeit folgendes:

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
glGenFramebuffers(1, &framebufferHandle);
glBindFramebuffer(GL_FRAMEBUFFER, framebufferHandle);

// pos, normal, color
// ...


// depth
glGenTextures(1, &depthTextureHandle);
glBindTexture(GL_TEXTURE_2D, depthTextureHandle);
        
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT32, windowWidth, windowHeight, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);

// ...

//set attachments
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, positionTextureHandle, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, normalTextureHandle, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT2, GL_TEXTURE_2D, colorTextureHandle, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT,  GL_TEXTURE_2D, depthTextureHandle, 0);

/set the list of draw buffers.
GLenum drawBufferHandles[3] = {GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2};
glDrawBuffers(3, drawBufferHandles);


Dann im GBuffer Fragment Shader

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
layout(location = 0) out vec4 positionOutput;
layout(location = 1) out vec3 normalOutput;
layout(location = 2) out vec4 colorOutput;
 
void main(){
    positionOutput = pass_Position;
    normalOutput = normalize(pass_Normal);

    colorOutput = texture(tex,pass_TexCoord);
}


Und im Compositing (hier will für debugging die tiefenkarte rendern)

HLSL-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
in vec2 passUV;

uniform sampler2D positionMap;
uniform sampler2D normalMap;
uniform sampler2D colorMap;
uniform sampler2D depthMap;

out vec4 fragmentColor;

void main() {
    vec4 position = texture(positionMap, passUV);
    vec4 normal = texture(normalMap, passUV);
    vec4 color = texture(colorMap, passUV);

    float depth = texture(depthMap, passUV).x;
  
    

    fragmentColor = vec4(depth,depth,depth,1);
}


Im Anhang seht ihr wie es derzeit ausschaut. Sieht für mich schwer falsch aus.
Was mache ich denn verkehrt?

Danke schonmal für jeglichen Beistand,

Gruß
»Sc4v« hat folgende Bilder angehängt:
  • SSAO 2013-08-05 14-42-09-29.jpg
  • SSAO 2013-08-05 14-42-22-85.jpg

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

2

05.08.2013, 21:30

Interessanterweise funktioniert mein Vorhaben wenn ich die Tiefentextur auf GL_TEXTURE0 setze (und damit die positionMap nicht binde). Das ist ziemlich strange, denn ich benutze ne gtx580 und die sollte mehr als 3 Texture Units unterstüzen

LukasBanana

Alter Hase

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

3

06.08.2013, 08:36

Das ist ziemlich strange, denn ich benutze ne gtx580 und die sollte mehr als 3 Texture Units unterstüzen

Ja, allerdings. Sogar die Fixed-Function Pipeline unterstützt 4 Texture Units und die Programmable Piepieline mal mindestens 8.

Zu deinem Problem kann ich dir aber leider nicht direkt helfen.
Hast du schon mal probiert selbst per gl_Depth die Tiefe zu schreiben?
Oder wie auch immer das mit GL 3+ Core Profile geht.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

4

06.08.2013, 11:19

Hast du schon mal probiert selbst per gl_Depth die Tiefe zu schreiben?

nein habe ich noch nicht. Aber das wirft eine mich interessierende Frage auf: Was ist die Tiefe eines Fragments zu diesem Zeitpunkt? Position.z, FragCoord.z oder muss ich die nicht lineare skalierung noch selber mit einberechnen?

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

5

06.08.2013, 11:53

Konnte das Problem jetzt durch explizite Angabe der uniform location lösen können. Das ist zwar irgendwie merkwürdig aber naja...
vielleicht hat ja jemand eine plausbile Erklärung dafür ?(

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Sc4v« (06.08.2013, 18:27)


Werbeanzeige