При проверке ошибок я получаю [EDIT:] 1282 («недействительная операция»). Я полагаю, это означает, что OpenGL все еще использует OpenGL 2 для glTexImage2D, и поэтому вызов терпит неудачу.
blockquote>Ошибки OpenGL не так сложно понять.
GL_INVALID_ENUM/VALUE
выдаются, когда вы передаете что-то переименование или значение, которое является неожиданным, неподдерживаемым или вне диапазона. Если вы передадите «17» в качестве внутреннего формата вglTexImage2D
, вы получитеGL_INVALID_ENUM
, потому что 17 не является допустимым номером перечисления для внутреннего формата. Если вы пройдете 103,422 в качестве ширины доglTexImage2D
, вы получитеGL_INVALID_VALUE
, потому что 103,422 почти наверняка больше размераGL_MAX_TEXTURE_2D
.
GL_INVALID_OPERATION
всегда используется для комбинации состояния, которые идут не так. Либо есть какое-то ранее заданное состояние контекста, которое не связывается с вызываемой вами функцией, или два или более скомпонованных параметра создают проблему. Последнее имеет место, если вы здесь.Если ваша реализация вообще не поддерживает целые текстуры, вы получите
INVALID_ENUM
(поскольку внутренний формат не является допустимым форматом). ПолучениеINVALID_OPERATION
означает, что что-то еще не так.А именно:
glTexImage2D(GL_TEXTURE_2D,0,get_type(1), TEXTURE_SIZE,TEXTURE_SIZE, 0,get_type(2),data_type,data);
Ваш вызов
get_type(2)
возвращаетGL_RGB
илиGL_RGBA
во всех случаях. Однако при использовании интегральных форматов изображений вы должны использовать формат передачи изображения с_INTEGER
в конце .Таким образом, ваш
get_type(2)
должен быть таким:inline GLenum get_type(int which) { return (which==1)? GL_RGB16UI: GL_RGB_INTEGER; }
И аналогичным образом для других встроенных форматов изображений.
Я написал метод, который делает то, что вы просили. На это не очень красиво смотреться, но он делает свою работу.
def subIntervals(a,b):
outputList = [[[a]]]
for n in range(a+1, b+1):
newOutputList = []
for e in outputList:
newOutputList.append(e + [[n]])
newOutputList.append(e[:-1] + [[e[-1][0], n]])
outputList = newOutputList
return outputList
Я добавлю объяснение, если это необходимо.
Вы можете использовать функцию, которая выдает интервалы от чисел, ближайших к a
(который сам является a
) до b
, а затем рекурсивно возвращает интервалы от a + 1
до b
:
, так что:
list(intervals(2, 5))
возвращает:
[[[2], [3], [4], [5]],
[[2], [3], [4, 5]],
[[2], [3, 4], [5]],
[[2], [3, 5]],
[[2, 3], [4], [5]],
[[2, 3], [4, 5]],
[[2, 4], [5]],
[[2, 5]]]