2016-04-08 6 views
0

Существуют ли определенные ограничения формата, которые необходимо соблюдать текстуры?OpenGL Textures Format Ограничения

Я загрузки TGA файлы и вовлекая их со следующим фрагментом шейдера:

varying vec2  v_texCoord; 
uniform sampler2D s_texture; 
uniform vec4  vColor4; 

void main() 
{ 
    vec4 tmpColor = texture2D(s_texture, v_texCoord); 

    tmpColor.r = vColor4.r; 
    tmpColor.g = vColor4.g; 
    tmpColor.b = vColor4.b; 

    gl_FragColor = tmpColor; 
} 

Я считаю, что 16х16 изображение выводится на экран OK. Дисплей 64x16 OK. 72x16, 80x16 и 96x16 не работают.

При необходимости я предоставил дополнительную информацию, включая файлы TGA.

+2

Вы используете OpenGL или OpenGL ES? Раньше существовали ограничения на текстуры, которые в обоих измерениях должны были быть сильными. Однако это ограничение было удалено из OpenGL после версии 2.0. С OpenGL ES и WebGL это ограничение все еще может быть (если ваша реализация не поддерживает расширение, удаляющее ограничение). – radical7

+0

@ radical7 Я использую OpenGL ES2.0. Это будет иметь смысл, что вы говорите. Итак, после 64x16 это должно быть 128x16 и 256x16 и т. Д.? – SparkyNZ

+0

просто пойдите с 2^n, как 2 4 8 16 32 64 128 256 512 1024 .. Это очевидно. – Sung

ответ

0

72, 80 и 96 не являются полномочиями двух; это требование имеет мало общего с форматом данных в OpenGL ES. Это требование действительно распространено даже в современных настольных системах GL, где это может зависеть от используемого формата данных.

Несжатые данные текстуры в (рабочем столе) OpenGL 2.0 или более могут иметь размеры без использования двух измерений.

Однако сжатые данные текстуры продолжают требовать, чтобы размеры блоков, кратные 4-пиксельным передаточным функциям, продолжали предполагать 4-байтовое выравнивание данных для каждой строки изображения, текстуры с плавающей запятой, если они поддерживаются, также могут потребовать два и т. д.

Многие библиотеки изображений, предназначенные для GL, на самом деле перераспределяют материал на две части, что может решить каждую из проблем, описанных выше. Это не всегда самый подходящий способ (это может быть очень расточительно), чтобы исправить проблемы с размерностью, но он может быть применен повсеместно к любой проблеме общего измерения.

+0

Да, все текстуры, которые я использую, сжаты. – SparkyNZ

+0

"* Несжатые данные текстуры на рабочем столе OpenGL 2.0 или выше могут иметь размеры без параметров. *« Нет, *** все *** текстуры на рабочем столе OpenGL 2.0+ могут иметь не-power-of- 2 измерения, сжатые или нет. Размеры блоков не имеют ничего общего с размером текстуры, так как частичные блоки не запрещены спецификацией OpenGL. Спецификация дает понять, как работают сжатые форматы блоков для текстур, размеры которых не делятся на размер блока. Поэтому ваш ответ относится только к OpenGL. –

+0

Этот комментарий полностью запутан и правдоподобен. Тексты DXTn в качестве простого примера будут генерировать 'GL_INVALID_OPERATION', если вы попытаетесь выделить хранилище данных с неблокируемыми согласованными измерениями.Другие сжатые форматы имеют свои собственные правила, обсуждаемые в их соответствующих спецификациях расширения. И, конечно же, это относится только к OpenGL, я стараюсь, чтобы мои ответы соответствовали обсуждаемым API. Если вы хотите обсудить Vulkan, Direct3D или какой-либо другой API, быть моим гостем, но я не вижу, какое значение он добавит к вопросу. –