Некоторое время назад я конвертировал мою программу на 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 - массив массивов модулей.
Как уже говорилось, на некоторых компьютерах рендеринг работает нормально, а удаление текстуры вызывает ошибку времени выполнения во всех системах (кроме моей).нетбук, где я не могу создавать текстуры вообще, хотя я думаю, что это может быть связано с проблемой качества).
Если кто-то может предоставить какую-либо актуальную информацию, это было бы здорово.Я потратил много дней на программу и очень хотел бы совместить ее с менее хорошими видеокартами.