Frage

Nach ARB_geometry_shader4 ist es möglich, eine Szene auf das zu machen, 6 Flächen eines Würfels Karte mit einem Geometrie-Shader und der Würfel Karte einem Framebuffer-Objekt angebracht ist. Ich möchte eine Schattenkarte mit dieser Art und Weise erstellen. Allerdings scheint es, einen Konflikt zu sein, die ich nicht lösen kann:

  1. Ich kann nur eine Textur mit GL_DEPTH_COMPONENT als internem Typ der GL_DEPTH_ATTACHMENT_EXT befestigen.
  2. Eine Tiefe Textur kann nur 1D- oder 2D sein.
  3. Wenn ich eine Cubemap anhängen möchten, alle anderen angeschlossenen Texturen müssen auch Würfel Karten sein.

So sieht es aus wie ich keine Tiefenprüfung verwenden kann, wenn ich zu einem Würfel Karte machen möge. Oder was genau bin ich hier fehlt?

EDIT: Es sieht aus wie neuere Nvidia-Treiber (180.48) Auflagertiefe Würfel Karten

.
War es hilfreich?

Lösung

Ok, ein paar Fragen zu beantworten hier:

Natürlich ist es möglich, 6 FBOs zu verwenden, einen für jedes Gesicht. Oder man FBO verwenden und jedes Gesicht an, bevor Sie es zeichnen. In beiden Fällen wird das Cubemap Gesicht wie jede andere 2D-Textur behandelt werden und man kann es mit normalen 2D-Texturen oder Renderbuffers zusammen verwenden. Und es ist wahrscheinlich nicht viel Unterschied in allen möglichen Arten (wenn die Hardware unterstützt werden).

Es ist jedoch auch möglich, alles in einem Schritt zu zeichnen und wie ich zu neugierig war, wie dies geschehen ist habe ich einige der Forschung.

Um ein FBO mit allen Flächen eines Würfels Karte zu erstellen, um einen einzigen Befestigungspunkt angebracht ich diesen Code verwendet (in D geschrieben):

// depth cube map
glGenTextures(1, &tDepthCubeMap);
glBindTexture(GL_TEXTURE_CUBE_MAP, tDepthCubeMap);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_DEPTH_COMPONENT24,
        width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, null);
}

// color cube map
glGenTextures(1, &tColorCubeMap);
glBindTexture(GL_TEXTURE_CUBE_MAP, tColorCubeMap);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
for (uint face = 0; face < 6; face++) {
    glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, 0, GL_RGBA,
        width, height, 0, GL_RGBA, GL_FLOAT, null);
}

// framebuffer object
glGenFramebuffersEXT(1, &fbo);
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, tDepthCubeMap, 0);
glFramebufferTextureARB(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, tColorCubeMap, 0);

glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);

if (!isValidFBO()) {
    glDeleteFramebuffersEXT(1, &fbo);
    fbo = 0;
}
  • Wenn Sie nur eine Tiefenkarte haben wollen, müssen Sie ändern glDrawBuffer (GL_COLOR_ATTACHMENT0_EXT); glDrawBuffer (GL_NONE); , bevor es (und vor dem Ziehen, um es Validierung )
  • MIN und MAG-Filter müssen gültig etwas eingestellt werden (Standard wäre GL_NEAREST_MIPMAP_LINEAR)
  • Breite und Höhe aller Texturen müssen gleich
  • sein

zu den Flächen eines Würfels Karte machen Sie einen Geometrie-Shader benötigen. Die folgenden Shader verfehlt einige Umdrehungen, aber es sollte klar sein, was es tut. gl_Layer wird verwendet, um die primitiven auf das richtige Gesicht zu lenken (0 = + X, 1 = -X, ...).

#version 120
#extension GL_EXT_geometry_shader4 : enable

void main(void) {
    int i, layer;
    for (layer = 0; layer < 6; layer++) {
        gl_Layer = layer;
        for (i = 0; i < 3; i++) {
            gl_Position = gl_PositionIn[i];
            EmitVertex();
        }
        EndPrimitive();
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top