2017-01-19 2 views
1

프레임 버퍼를 사용하여 동적으로 여러 큐브 맵을 설정하는 프로그램을 작성 중입니다.이 큐브는 쉐이더에서 사용할 배열로 패킹하려고합니다. 현재 단일 큐브 맵을 허용하도록 코드를 설정했지만 cubemaparrays에서 작동하도록하는 데 문제가 있습니다. 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)); 
} 

이 모든 것을 렌더링하면 검은 색 객체, 즉 질감이 없습니다. 그러나 하나의 큐브 맵으로 교체 할 때 문제가 없으므로 배열을 초기화하거나 배열에 이미지를 바인딩하는 방법에 문제가 있음을 확신합니다. 어떤 아이디어?

+0

"* glTexSubImage3D *"왜 당신이이 호출을하는 당신이하지 않은 경우 : 큐브 맵의 첫 번째 레이어의 얼굴 인덱스를 의미하는 i를 원하는 경우

그래서, 당신은이 작업을 수행 할 것 그들에게 데이터를 전달 하는가? 랩 모드를 설정하고 있다면'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으로 만 허용됩니다. 당신은 아마 후자를 사용할 것을 의미합니다.

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

"i"는 얼굴 색인 값을 나타내는 것으로되어 있습니다. 그렇습니다. 그래서 다음 큐브 맵을 변경하고 싶다면 다음과 같이하면됩니다 : "glFramebufferTextureLayer (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, cubemapArray, 1, i);"? – irishMTS

+0

이렇게 진행하면서, 저는 여전히 매우 혼란 스럽습니다. 저는 개인적으로 얼굴을 만들고 있어요. 나는 얼굴을 그처럼 추가 할 수 있기를 원해요. 이것은 내가 별도의 큐브 맵을 생성하고 그 큐브 맵을 큐브 맵에 레이어로 추가해야한다는 것을 의미합니까? 현재 glFramebufferTexture3D 대신 glFramebufferTextureLayer를 사용하도록 코드를 편집했지만 아직 텍스처가 없습니다. – irishMTS