フレームバッファを使用して動的に多数のキューブマップを設定するプログラムを作成していますが、シェーダで使用するために配列にパックしたいと考えています。私は現在、単一のキューブマップを可能にするようにコードを設定していますが、キューブアレイで使用するには問題があります。ダイナミックCubemapArrayをレンダリングする
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);
}
。実行時にテクスチャを追加できるように設定しておきたいと思っています。
これは私がそれにフレームバッファのテクスチャを追加する方法その後、次のとおりです。
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は()私はそれに合格フレームバッファにシーンのほとんどをレンダリングする私のメインのレンダリングループ、です。 mirrorCamは私がキューブマップのために設定したカメラオブジェクトです。
glBindTexture(GL_TEXTURE_2D, cubemapArray);
glUniform1i(glGetUniformLocation(reflectiveShaderID, "cube_array"), 0);
最後に、私のシェーダコード:
その後、私のシェーダーにそれを渡すために、私はこれらの行を持っています。
uniform samplerCubeArray cube_array;
//....
void main()
{
//...
fragment_color = texture(cube_array, vec4(textureCoordinates, 0));
}
これをすべてレンダリングすると、黒いオブジェクト、つまりテクスチャが得られません。しかし、1つのキューブマップに入れ替えるとうまくいくので、問題はアレイの初期化中か、イメージを配列にどのようにバインドするかのいずれかであると確信しています。何か案は?
「* glTexSubImage3D *」なぜ、あなたはこれらの呼び出しを行っていますそれらにデータを渡しますか?ラップモードを設定している場合は、なぜ 'GL_TEXTURE_WRAP_R'ラップモードも設定していませんか? –
これを設定するための例には、これらの呼び出しが含まれています。私は、後で値を動的に設定できるように、いくつかの図形または書式でレイヤーを初期化する必要があると仮定しました。 – irishMTS