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?
„* 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? –
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