2017-01-19 4 views
1

フレームバッファを使用して動的に多数のキューブマップを設定するプログラムを作成していますが、シェーダで使用するために配列にパックしたいと考えています。私は現在、単一のキューブマップを可能にするようにコードを設定していますが、キューブアレイで使用するには問題があります。ダイナミック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つのキューブマップに入れ替えるとうまくいくので、問題はアレイの初期化中か、イメージを配列にどのようにバインドするかのいずれかであると確信しています。何か案は?

+0

「* glTexSubImage3D *」なぜ、あなたはこれらの呼び出しを行っていますそれらにデータを渡しますか?ラップモードを設定している場合は、なぜ 'GL_TEXTURE_WRAP_R'ラップモードも設定していませんか? –

+0

これを設定するための例には、これらの呼び出しが含まれています。私は、後で値を動的に設定できるように、いくつかの図形または書式でレイヤーを初期化する必要があると仮定しました。 – irishMTS

答えて

1

まずは、道のうち、明白なことを取得してみましょう:

uniform samplerCube cube_texture; 

をあなたはcubemap array、あなたが必要use samplerCubeArray as your sampler typeから読みたい場合。やや明瞭のために今

、:

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

あなたがキューブマップ配列の各顔にレンダリングしようとしている場合、それはそれを行う方法はありません。 iが何を表しているかははっきりしませんが、キューブマップ配列の最初のレイヤーの顔になっているのであれば、それはあなたのやり方ではありません。

キューブマップの配列のテクスチャを参照しないでください。キューブマップのターゲットを使用してください。代わりに、レイヤーフェイスを使用します。また、キューブマップの配列テクスチャはglFramebufferTexture3Dを使用しません。それらはglFramebufferTextureまたはglFramebufferTextureLayerでのみ許可されます。おそらく後者を使うことを意味します。

あなたはiは、キューブマップの最初の層の面指数を意味したいのであれば、あなたはこれを行うだろう:あなたがいないのであれば

​​
+0

"i"は顔のインデックス値を表すはずです。つまり、次のキューブマップを変更したい場合は、次のようにします: "glFramebufferTextureLayer(GL_FRAMEBUFFER、GL_COLOR_ATTACHMENT0、cubemapArray、1、i);"? – irishMTS

+0

だからこそ、私はまだ非常に混乱しています。私は個々に顔を作成しています。そのような顔を追加することができます。これは、私が別々のキューブマップを作成し、それらのキューブマップをレイヤーとしてcubemaparrayに追加する必要があるということですか?現在、glFramebufferTexture3Dの代わりにglFramebufferTextureLayerを使用するようにコードを編集しましたが、まだテクスチャを取得していません。 – irishMTS

関連する問題