내가 여기에 코드 ++ 내 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()
을 사용하여 바인딩 할 수 있습니까? 는
빠른 답장을 보내 주셔서 감사합니다. 그러나 실제로, glTexStorage2D() 대신에'glTexImage2D()'를 사용하려고합니다. 실제로'glTexStorage2D()'를 사용하여 텍스처를 생성하고 바인드 할 때 오류가 발생하지는 않지만 이미지에 원자 작업을 작성하거나 수행하는 것은 효과가 없습니다. 그래서 텍스쳐가 제대로로드되지 않았기 때문일 수 있다고 생각했습니다. 그게 내 문제의 이유라고 생각합니까? 아니면 잘못된 방향으로보고 있습니까? N.B. 스펙에 따르면'glTexImage2D()'를 사용하는 것은'glTexStorage2D()'와 동일합니다. 미리 감사드립니다! –
@ElouarnLaine : 'glTexStorage' 또는'glTextureView'라는 불변의 저장 공간을 가진 텍스처를 만드는 방법은 두 가지 밖에 없습니다. "* 사양에 따르면 glTexImage2D()를 사용하면 glTexStorage2D()와 동일합니다. *"어떤 스펙에 따르면? ES 3.1 스펙은'glTexStorage2D'가 불변 상태를 설정한다는 것을 명확히하기 때문에'glTexImage2D'는 그렇지 않습니다. –
@NicolBolas :'glTexStorage2D()'섹션의 [khronos documentation] (https://www.khronos.org/opengles/sdk/docs/man31/)에서 : "_ glTexStorage2D의 동작은 대상 매개 변수에 따라 다릅니다 target이 GL_TEXTURE_2D 인 경우, glTexStorage2D를 호출하면 오류가 발생하지 않는다고 가정하고, 다음 의사 코드를 실행합니다.내 질문은 :'glBindImageTexture()'를 사용하여'glTexImage2D()'로 만든 텍스처를 바인딩 할 수 있습니까? –