2016-06-30 8 views
0

내가 여기에 코드 ++ 내 C의 glBindImageTexture()는 OpenGL ES 3.1 glTexImage2D

를 사용하여 결합 할 수 glTexImage2D()와 불변의 질감 만들려고 해요와 불변의 질감을 만들 수 없습니다 :

GLuint id; 
glGenTextures(1, &id); 

glBindTexture(GL_TEXTURE_2D, id); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0); 


GLint width = 2046; 
GLint height = 1086; 

// Not sure what to put here 1, 2, 4 or 8 ? 
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 

GLint levels; 
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &levels); 

for (int i = 0; i < levels + 1; i++) 
{ 

    glTexImage2D(GL_TEXTURE_2D, i, GL_R32UI, width, height, 0, GL_RED_INTEGER, GL_UNSIGNED_INT, NULL); 
    width = glm::max(1, (width/2)); 
    height = glm::max(1, (height/2)); 

    // check OpenGL error 
    GLenum err; 
    while ((err = glGetError()) != GL_NO_ERROR) { 
     ALOGE("ERROR_GL_TEXTURE_INIT: %i", err); 
    } 
} 

GLint status; 
glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_IMMUTABLE_FORMAT,&status); 
ALOGE("IMMUTABLE_TEXTURE: %i", status); 

glBindTexture(GL_TEXTURE_2D, 0); 

glBindImageTexture(0, id, 0, GL_FALSE, 0, GL_READ_WRITE, GL_R32UI); 

// check OpenGL error 
GLenum err; 
while ((err = glGetError()) != GL_NO_ERROR) { 
    ALOGE("ERROR_GL_TEXTURE_IMG-USE: %i", err); 
} 

로를 I 밉맵 레벨이 필요하지 않습니다. GL_TEXTURE_MAX_LEVEL ~ 0으로 설정하십시오.
그런 다음 glTexImage2D()을 호출하여 모든 텍스처의 레벨을 설정합니다 (여기 하나만 사용). 오류가 발생하지 않았습니다.


불행히도
glGetTexParameteriv(GL_TEXTURE_2D,GL_TEXTURE_IMMUTABLE_FORMAT,&status)의 결과는 텍스처 불변 아니라는 것을 의미 0이다. 이제

, 내가 glBindImageTexture()를 호출하려고, 오류 1282은 그것이 khronos documentation로 작성하기 때문에로 발생,이 OpenGL을 함수는 불변 질감이 필요합니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까? 사전에

감사)

편집 :

당신의 시간에 대한 모든 정보를 제공하지만 난 이해가 안되는 부분이 여러분 모두에게 감사합니다.

glTexStorage2D() 사람 (khronos documentation)이 단락은 나를 혼란 :

glTexStorage2D의 동작은 대상 매개 변수에 따라 달라집니다. 타겟 GL_TEXTURE_2D되면 호출 glTexStorage2D은 다음의 의사 코드의 실행에 에러가 발생되지 않는 가정 동일하다 : 실제로 제공없는 텍스쳐 데이터 이후

for (i = 0; i < levels; i++) 
{ 
    glTexImage2D(target, i, internalformat, width, height, 0, format, type, NULL); 
    width = max(1, (width/2)); 
    height = max(1, (height/2)); 
} 

를 상기 pseudo-code 용으로 사용되는 값 형식 및 유형은 부적절하며 선택한 내부 형식 열거 자에 대해 합당한 값으로 간주 될 수 있습니다. internalformat은 표 1에 주어진 크기의 내부 형식 중 하나이거나 아래의 표 2에 제공된 압축 된 내부 형식 중 하나 여야합니다. 성공시 GL_TEXTURE_IMMUTABLE_FORMAT의 값은 GL_TRUE이됩니다. GL_TEXTURE_IMMUTABLE_FORMAT의 값은 pname이 GL_TEXTURE_IMMUTABLE_FORMAT로 설정된 glGetTexParameter를 호출하여 발견 할 수 있습니다. 텍스처 오브젝트의 크기 나 형식을 더 이상 변경할 수 없습니다. glTexImage2D 또는 glTexStorage2D에 대한 다른 호출과 같이 텍스처 객체의 크기 나 형식을 변경할 수있는 명령을 사용하면 GL_INVALID_OPERATION 오류가 발생합니다. 사실 실제로는 크기 나 형식을 변경하지 않아도됩니다. 목적.

위의 문단이 약 glTexImage2D() 또는 glTexStorage2D() 인 경우 명확하지 않습니다.

내 기본 질문은 glTexImage2D()으로 만든 텍스처를 glBindImageTexture()을 사용하여 바인딩 할 수 있습니까?

답변

1

불변의 질감 스토리지를 할당하려면, 당신은 glTexStorage2D() 대신 glTexImage2D() 사용 (나는이 두 가지 기능이 실제로 함께 사용 된 코드 샘플, 예를 들어 here를 보았다). 그래서 텍스처 메모리를 할당하는 전화가된다 :이 경우

glTexStorage2D(GL_TEXTURE_2D, levels, GL_R32UI, width, height); 

을, 당신은 당신이 현재 가지고 루프가 필요하지 않도록 당신이 하나의 호출로 모든 밉맵 레벨을 할당합니다.

또한, 나는 이것에 대한 기대가 무엇인지 확실하지 않다 : 당신의 코드에서

GLint levels; 
glGetTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &levels); 

당신이 전화를 걸 때, 당신은 단지 텍스처를 만들었습니다. 그래서 레벨의 수를 질의하는 것은 의미가 없습니다. 밉맵 텍스처가 필요하면 크기에 따라 필요한 밉맵 수를 계산해야합니다. 밉 매핑이 필요없는 경우 두 번째 인수에 1glTexStorage2D()으로 전달하기 만하면됩니다.


불변의 텍스처를 생성하는 다른 방법이 있는지에 대한 후속 질문이 있었기 때문에. glTexImage2D()으로 대답하면 아니오입니다. 168 페이지에서 시작하는 ES 3.1 스펙의 "변경 불가능한 형식 텍스처 이미지"섹션 8.17에서는 변경 불가능한 텍스처를 만드는 방법을 설명합니다. 해당 섹션에 나열된 통화는 glTexStorage2D()glTexStorage3D()입니다. 또한이 호출이 GL_TEXTURE_IMMUTABLE_FORMAT 속성을 true로 설정한다고 구체적으로 언급했습니다.

그것은 불변 질감이 glTexImage2D() 불변 하지있는 텍스처를 생성하는 수단 (171) 페이지

섹션 8.8에서 glTexStorage2DMultisample()이다 만드는 언급 유일한 다른 전화. 이것을 확인하면 다양한 질감 속성의 디폴트 값은 나열된 194 페이지에 "질감 상태"라는 제목의 섹션 8.18이다 초기 상태

[...] TEXTURE_IMMUTABLE_FORMAT의 값은 FALSE이다.

glTexImage2D()의 사양에는 값 변경에 대한 언급이 없으므로 false로 유지됩니다.

+0

빠른 답장을 보내 주셔서 감사합니다. 그러나 실제로, glTexStorage2D() 대신에'glTexImage2D()'를 사용하려고합니다. 실제로'glTexStorage2D()'를 사용하여 텍스처를 생성하고 바인드 할 때 오류가 발생하지는 않지만 이미지에 원자 작업을 작성하거나 수행하는 것은 효과가 없습니다. 그래서 텍스쳐가 제대로로드되지 않았기 때문일 수 있다고 생각했습니다. 그게 내 문제의 이유라고 생각합니까? 아니면 잘못된 방향으로보고 있습니까? N.B. 스펙에 따르면'glTexImage2D()'를 사용하는 것은'glTexStorage2D()'와 동일합니다. 미리 감사드립니다! –

+0

@ElouarnLaine : 'glTexStorage' 또는'glTextureView'라는 불변의 저장 공간을 가진 텍스처를 만드는 방법은 두 가지 밖에 없습니다. "* 사양에 따르면 glTexImage2D()를 사용하면 glTexStorage2D()와 동일합니다. *"어떤 스펙에 따르면? ES 3.1 스펙은'glTexStorage2D'가 불변 상태를 설정한다는 것을 명확히하기 때문에'glTexImage2D'는 그렇지 않습니다. –

+0

@NicolBolas :'glTexStorage2D()'섹션의 [khronos documentation] (https://www.khronos.org/opengles/sdk/docs/man31/)에서 : "_ glTexStorage2D의 동작은 대상 매개 변수에 따라 다릅니다 target이 GL_TEXTURE_2D 인 경우, glTexStorage2D를 호출하면 오류가 발생하지 않는다고 가정하고, 다음 의사 코드를 실행합니다.내 질문은 :'glBindImageTexture()'를 사용하여'glTexImage2D()'로 만든 텍스처를 바인딩 할 수 있습니까? –