Это странный вопрос, но мне было интересно, почему glTexImage2d заботится о типе данных пикселей и формате данных Null. Подпись для glTexImage2d является …
void glTexImage2D( GLenum target, GLint level, GLint internalFormat,
GLsizei width, GLsizei height, GLint border, GLenum format,
GLenum type, const GLvoid * data);
Внутренний формат сообщает графическому драйверу, что вы хотите хранить данные, как в графическом процессоре, а формат и тип сообщают графическому драйверу, что ожидать от данных GLvoid *. Итак, если я не передаю какие-либо данные, например, передавая null, почему графическому драйверу все равно, какой формат и тип? Так что это странный вопрос, потому что иногда это не так. Времена, когда это происходит, и я не проверял каждую отдельную итерацию, но, в частности, при создании текстуры глубины, или то, с чем я недавно сталкивался, это типы Integer, такие как GL_RED_INTEGER, GL_RG_INTEGER и т. Д. И / или их соответствующие внутренние форматы, такие как GL_R8I, GL_RGBA32UI. Принимая во внимание, что ни один из «простых» типов не должен в любом случае соответствовать внутреннему формату, например, GL_RGBA8, GL_RGBA32F и т. Д. По некоторым причинам прежние конкретные типы данных и форматы должны быть точными, даже если вы не передаете любые данные. Это почему?
В вызове есть два формата glTexImage2D (...)
, внутренний формат и формат, используемый для передачи пикселей. Внутренний формат необходим для выделения памяти для текстуры, формат передачи пикселей используется GL для интерпретации (необязательного) массива передаваемых пикселей.
Когда вы проходите NULL
для пиксельных данных передача пикселей не происходит, так что вы могли бы подумать, что format
а также type
было бы ненужным. Технически, они не нужны в этом случае, но GL все еще проверяет пару формат и тип. Вы можете использовать любую допустимую пару значений, которую хотите, так как в действительности операция переноса пикселей не выполняется. Все, что вы делаете, это выделяете хранилище текстур.
Кстати, glTexStorage2D (...)
это современный способ размещения хранилища текстур без передачи пикселей. Таким способом вы можете создавать неизменяемые текстуры, где вы не можете случайно переопределить текстуру LOD с помощью неверного glTexImage2D (...)
вызов. После выделения хранилища текстур с помощью glTexStorage2D (...)
Вы можете кормить его данными, позвонив glTexSubImage2D (...)
,
Если вы не передаете никаких данных, он все равно выделяет память на GPU для дальнейшего использования. Вот почему вы должны указать точный формат; сообщить GPU, сколько памяти он должен зарезервировать.