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

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

11

01.04.2014, 20:15

Ich kanns mir besser vorstellen.

Trotzdem, dieses Problem verstehe ich irgendwo nicht.
Alles ist im worldspace, Lichtberechnung wie beim forward rendering, ...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

12

06.04.2014, 12:18

Also ich hab noch mal versucht das ganze von Grund auf neu zu schreiben.
Aber trotzdem komme ich wieder zum gleichem Ergebnis: für negative Lichtrichtungen oder Positionen wird nicht "geshaded" :(

Also, das FBO setzte ich mit diffuse, position und normal Textur so auf (für alle drei gleich):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
diffuse = std::shared_ptr<bb::Texture>(new bb::Texture(GL_TEXTURE_2D));
    diffuse->bind();
    diffuse->texture2D(0, GL_RGB, width, height, 0, GL_RGB, GL_FLOAT, 0);
    diffuse->parameterf(GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    diffuse->parameterf(GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    diffuse->parameterf(GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    diffuse->parameterf(GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    diffuse->unbind();
    texture2D(GL_COLOR_ATTACHMENT0+1, diffuse->getID(), 0);

Ich habe auch probiert die w Koordinate zu behalten, macht aber keinen Unterschied.
In dieses wird dann so gerendert:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// vertex shader:
void main(){
    position = vec3(m*vec4(vertex0, 1.0)); // model Matrix*vertex
    normal = vec3(normalM*vec4(normal0, 0.0)); // model Matrix (invertiert, transponiert)*normal
    texCoord = texCoord0;
    gl_Position = pmv*vec4(vertex0, 1.0);
}

// fragment shader:
void main(){
    diffuseOut = vec3(texture(texture0, texCoord));
    positionOut = position;
    normalOut = normalize(normal);
}

Die Ausgabe der 3 Texturen sieht dann so aus:


(Link)


Also nach meiner Auffassung richtig.

Kombiniert und gerendert werden die Texturen dann so (renderpass, bei "output"):

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
44
45
46
47
48
49
void Playing::render(const float deltaTime){
    if(hasStarted){
        glViewport(0, 0, wndSize[0], wndSize[1]);

        //// 3D
        // to FBOs
        ds->bind();

        glCullFace(GL_BACK);
        glEnable(GL_CULL_FACE);
        glEnable(GL_DEPTH_TEST);
        glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);

        renderer3D->update(deltaTime);

        ds->unbind();

        // output
        glDisable(GL_CULL_FACE);
        glDisable(GL_DEPTH_TEST);

        dsShader->bind();
        dsShader->enableVertexAttribArrays();

        ds->diffuse->bind(GL_TEXTURE0);
        ds->position->bind(GL_TEXTURE0+1);
        ds->normal->bind(GL_TEXTURE0+2);

        dsShader->sendUniform("diffuse", 0);
        dsShader->sendUniform("position", 1);
        dsShader->sendUniform("normal", 2);

        dsOut->indexBuffer->bind();
        dsOut->vertex2Buffer->bind();
        dsOut->vertex2Buffer->vertexAttribPointer(dsShader->getAttribLocation("vertex0"), 2, GL_FLOAT, false, 0, 0);

        glDrawElements(GL_TRIANGLES, dsOut->indexBuffer->size(), GL_UNSIGNED_INT, 0);

        ds->diffuse->unbind();
        ds->position->unbind();
        ds->normal->unbind();

        dsShader->disableVertexAttribArrays();
        dsShader->unbind();

        //// 2D
        renderer2D->update(deltaTime);
    }
}

Die Shader sind simpel:

Quellcode

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
// vertex:

in vec2 vertex0;

out vec2 vertex;

void main(){
    vertex = vertex0;
    gl_Position = vec4(vertex0*2.0-1.0, 0.0, 1.0);
    gl_Position.z = 0.0;
}

// fragment:

struct DirLight{
    vec3 direction;
    vec4 diffuse, specular;
};

uniform sampler2D diffuse;
uniform sampler2D position;
uniform sampler2D normal;

DirLight light0 = DirLight(vec3(-1, 0, 0), vec4(0.3), vec4(0.1)); // hardcoded

in vec2 vertex;

void main(){
    vec4 color = texture(diffuse, vertex)*0.5;
    vec3 p = vec3(texture(position, vertex));
    vec3 n = normalize(vec3(texture(normal, vertex)));
    
    float ndotl = max(dot(n, normalize(light0.direction)), 0.0);
    
    if(ndotl > 0.0){
        color += ndotl*light0.diffuse;
    }
    
    gl_FragColor = color;
}


Und heraus kommt nur diffuse*0.5...

Vielleicht sieht ja jemand den Fehler, aber es kann entweder nur daran liegen dass die Daten falsch in den Shader kommen, was ich auf Grund der Texturen im FBO schon mal ausschließe, oder das Skalarprodukt stimmt nicht. Was ich aber auch nicht verstehen würde...

DeKugelschieber

Community-Fossil

  • »DeKugelschieber« ist der Autor dieses Themas

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

13

09.04.2014, 17:28

Soooooo Frage dank stackoverflow beantwortet:

G-Buffer in OpenGL "akzeptieren" keine negativen Farben mit GL_RGB als internes Format.
Daher verwende ich jetzt GL_RGB8_SNORM, dies erlaubt auch negative Werte (dadurch sehen die Texturen natürlich falsch aus).
Alternativ kann man die Daten auch selbst erst in den Bereich von 0;1 bringen und danach wieder zurückrechnen, also bei erstellen *0.5+0.5 und beim zurückrechnen *2.0-1.0.

Hier der Link.

Jetzt bleibt noch die Frage zum Umgang mit zusätzlichen Daten.
Wie machen es die Großen? Speichern diese z.B. Materialinformationen in einer zusätzlichen Textur?

Werbeanzeige