Проблемы с качеством текстур OpenGL - PullRequest
0 голосов
/ 05 декабря 2010

Некоторое время назад я конвертировал мою программу на C # для использования OpenGL и обнаружил, что она отлично (и быстрее) работает на моем компьютере дома.Тем не менее, у меня есть 2 вопроса.Во-первых, код, который я использую для освобождения текстур от видеокарты, не содержит слов, он дает мне исключение нарушения доступа к памяти во время выполнения.Во-вторых, большая часть графики не работает ни на одной другой машине, кроме моей.

Случайно мне удалось преобразовать часть графики в 8-битные PNG (все остальные 32-битные), и они работают нормальнона других машинах.Признавая это, я пытался регулировать качество при загрузке изображений.Мои попытки не увенчались успехом (это было некоторое время назад, я думаю, что в основном они пытались отформатировать растровое изображение, а затем использовать GDI для рисования текстуры на нем, создавая версию более низкого качества).Есть ли способ в .NET взять растровое изображение и приятно изменить качество?Соответствующий код ниже.Я помню, что это в значительной степени основано на том, что я обнаружил в прошлом над Переполнением стека, но которое не вполне соответствовало моим потребностям.«img» - это .NET-изображение, а «d» - целочисленное измерение, которое я использую, чтобы убедиться, что изображения квадратные.

uint[] output = new uint[1];

Bitmap bMap = new Bitmap(img, new Size(d, d));

System.Drawing.Imaging.BitmapData bMapData;
Rectangle rect = new Rectangle(0, 0, bMap.Width, bMap.Height);

bMapData = bMap.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadOnly, bMap.PixelFormat);

gl.glGenTextures(1, output);
gl.glBindTexture(gl.GL_TEXTURE_2D, output[0]);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_MAG_FILTER, gl.GL_NEAREST);

gl.glTexParameteri(gl.GL_TEXTURE_2D,gl.GL_TEXTURE_MIN_FILTER, gl.GL_NEAREST);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_S, gl.GL_CLAMP);
gl.glTexParameteri(gl.GL_TEXTURE_2D, gl.GL_TEXTURE_WRAP_T, gl.GL_CLAMP);
gl.glPixelStorei(gl.GL_UNPACK_ALIGNMENT, 1);
if (use16bitTextureLimit)
 gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA_FLOAT16_ATI, bMap.Width, bMap.Height, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, bMapData.Scan0);
else
 gl.glTexImage2D(gl.GL_TEXTURE_2D, 0, gl.GL_RGBA, bMap.Width, bMap.Height, 0, gl.GL_BGRA, gl.GL_UNSIGNED_BYTE, bMapData.Scan0);

bMap.UnlockBits(bMapData);
bMap.Dispose();

return output;

«use16bitTextureLimit» - это бул, и я скорее надеялсяПоказанный код снизит качество до 16 бит, но я не заметил никакой разницы.Может случиться так, что это работает, и Графическим картам все еще не нравится это.Я не смог найти никаких указаний на способ использования 8-битных PNG.Это функция, которая возвращает массив uint (в качестве адреса текстуры) для использования при рендеринге.Неправильная утилизация текстуры просто включает в себя: gl.glDeleteTextures(1, imgsGL[i]); Где imgGL - массив массивов модулей.

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

Если кто-то может предоставить какую-либо актуальную информацию, это было бы здорово.Я потратил много дней на программу и очень хотел бы совместить ее с менее хорошими видеокартами.

1 Ответ

0 голосов
/ 05 декабря 2010

Тип нарушения доступа, с которым вы сталкиваетесь, обычно происходит, если вызов glTexImage2D вызывает переполнение буфера. Дважды проверьте, чтобы все параметры glPixelStore, относящиеся к распаковке, были правильно установлены и , чтобы параметр формата (второй) соответствовал типу и размеру предоставленных вами данных. Я очень хорошо знаю этот вид bg, и это первые проверки, которые я обычно делаю, когда сталкиваюсь с ним.

Для текстуры, не отображаемой: проверяли ли вы, что размеры текстуры на самом деле являются степенями по два? В Си с использованием макроса тест на степень два можно записать так (этот сводится к тестированию, что там только один бит целого числа установлен)

#define ISPOW2(x) ( x && !( (x) & ((x) - 1) ) )

Впрочем, текстурное изображение не обязательно квадратное. Распространенное заблуждение, но на самом деле вам просто нужно убедиться, что каждое измерение имеет степень 2. Изображение 16 × 128 идеально.

Изменение внутреннего формата на GL_RGBA_FLOAT16_ATI, вероятно, даже повысит качество, но в этом нельзя быть уверенным, поскольку GL_RGBA может привести ко всему, что драйвер сочтет нужным. Кроме того, это формат, специфичный для поставщика, поэтому я не обращаю внимания на его использование. Существуют всевозможные форматы ARB, в том числе наполовину плавающие (то есть FLOAT16_ATI).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...