2017-01-19 4 views
1

Also schreibe ich ein Programm, das Framebuffer verwenden wird, um dynamisch eine Reihe von Cubemaps einzurichten, die ich in ein Array für die Verwendung in meinen Shadern packen möchte. Ich habe derzeit den Code für singlular cubemaps eingerichtet, aber ich habe Probleme damit, ihn für cubemaparrays zu verwenden.Rendern einer dynamischen CubemapArray

Meine Setup-Funktion für die cubemapArray:

void createCubemapArray(GLuint& cubemap) 
{ 
    //Generate an array texture 
    glGenTextures(1, &cubemap); 
    glBindTexture(GL_TEXTURE_CUBE_MAP_ARRAY, cubemap); 

    //Create storage for the texture. (4 layers of 1x1 texels) 
    glTexStorage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 
     1,     //No mipmaps as textures are 1x1 
     GL_RGB8,    //Internal format 
     width, height,     //width,height 
     4     //Number of layers 
    ); 

    for (unsigned int i(0); i != 4; ++i) 
    { 
     glTexSubImage3D(GL_TEXTURE_CUBE_MAP_ARRAY, 
      0,      //Mipmap number 
      0, 0, i,     //xoffset, yoffset, zoffset 
      1, 1, 1,     //width, height, depth 
      GL_RGB,    //format 
      GL_UNSIGNED_BYTE,  //type 
      0);    //pointer to data 
    } 

    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameteri(GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
} 

Dies ist in meiner Haupt-Funktion aufgerufen. Ich hoffe, ich habe es so eingerichtet, dass während der Laufzeit Texturen hinzugefügt werden können.

Dies ist dann, wie ich einen Framebuffer-Textur, um es hinzuzufügen:

vec3 position = mirrorCam.getPosition(); 
    view = look_at(position, position + normalise(viewsX[i]), vec3(0.0, -0.5, -0.5)); 
    drawloop(view, proj, fb[0][i].framebuffer); 
    glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemapArray, 0, 0); 

drawloop() ist mein Haupt Rendering-Schleife, die den größten Teil der Szene in den Framebuffer macht ich hineingeben. mirrorCam ist ein Kameraobjekt, das ich für die Cubemaps eingerichtet habe.

Dann es in meinen Shadern zu passieren, ich habe diese Zeilen:

glBindTexture(GL_TEXTURE_2D, cubemapArray); 
glUniform1i(glGetUniformLocation(reflectiveShaderID, "cube_array"), 0); 

Schließlich mein Shader-Code. Verkürzte zu den wichtigen Teilen:

uniform samplerCubeArray cube_array; 
//.... 
void main() 
{ 
//... 
fragment_color = texture(cube_array, vec4(textureCoordinates, 0)); 
} 

Wenn das alles gemacht wird, bekomme ich ein schwarzes Objekt, das heißt, keine Textur. Wenn ich jedoch eine einzelne Cubemap einwähle, funktioniert es einwandfrei, und ich bin davon überzeugt, dass das Problem entweder in meiner Initialisierung des Arrays oder darin liegt, wie ich die Bilder an das Array binde. Irgendwelche Ideen?

+0

„* glTexSubImage3D *“ Warum machen Sie diese Anrufe, wenn Sie nicht Daten an sie weitergeben? Und wenn Sie den Umbruchmodus einstellen, warum stellen Sie nicht auch den Umbruchmodus 'GL_TEXTURE_WRAP_R' ein? –

+0

Das Beispiel, dem ich folgte, um diese Einstellung einzurichten, beinhaltete diese Anrufe.Ich nahm an, dass Sie Ebenen in einer Form oder einem Format initialisieren müssen, damit Sie die Werte später dynamisch festlegen können. – irishMTS

Antwort

1

Lassen Sie uns zunächst die aus dem Weg offensichtlich erhalten:

uniform samplerCube cube_texture; 

Wenn Sie von einem cubemap array lesen möchten, müssen Sie use samplerCubeArray as your sampler type.

Nun, für die etwas weniger offensichtlich:

glFramebufferTexture3D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, cubemapArray, 0, 0); 

Wenn Sie jede Seite des Cubemap Array zu machen versuchen, das ist nicht, wie es geht. Es ist nicht genau klar, was i darstellt, aber wenn es ein Gesicht der ersten Schicht im Cubemap-Array sein soll, ist es nicht so, wie Sie es tun.

Siehe, Cubemap Array Texturen nicht jemals Verwenden Sie die Cube Map Gesicht Ziele. Stattdessen verwenden sie Ebenenflächen. Auch Cubemap-Array-Texturen verwenden glFramebufferTexture3D nicht; sie sind nur mit glFramebufferTexture oder glFramebufferTextureLayer zulässig. Sie wollen wahrscheinlich das letztere benutzen.

Also, wenn Sie wollen i das Gesicht Index der ersten Schicht in der Cubemap bedeuten, würden Sie dies tun:

glFramebufferTextureLayer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapArray, 0, i); 
+0

"i" sollte den Gesichtsindexwert darstellen, ja. Das heißt, wenn ich die nächste Cubemap ändern möchte, würde ich folgendes tun: "glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapArray, 1, i);"? – irishMTS

+0

Durch diese Sache bin ich immer noch sehr verwirrt. Ich erstelle individuell die Gesichter und möchte sie als solche hinzufügen. Bedeutet das, dass ich separate Cubemaps erstellen und diese Cubemaps dann als Layer zum Cubemaparray hinzufügen soll? Derzeit habe ich meinen Code bearbeitet, um glFramebufferTextureLayer anstelle von glFramebufferTexture3D zu verwenden, aber ich bekomme immer noch keine Textur. – irishMTS

Verwandte Themen