Я буду вкратце об этом, так как вы можете найти учебные пособия практически по всем частям решения.
Вам нужно загрузить изображение с диска и создать текстуру.
Вам необходимо создать объект кадрового буфера (FBO) с желаемыми целевыми размерами (в вашем случае, двойной шириной, двойной высотой). Сделайте FBO активным для рендеринга.
Визуализация полноэкранного четырехугольника с примененной текстурой.
Прочитать результат, используя glReadPixels ().
И все ... аппаратное обеспечение для наложения текстур позаботится о том, чтобы изменить его для вас. Но это, вероятно, будет медленнее, чем если бы это было сделано на процессоре, особенно для «масштабирования в 2 раза».
РЕДАКТИРОВАТЬ : по требованию OP необходимо включить исходный код.
Итак ... для загрузки изображения в Java, вы должны пойти на это:
BufferedImage img;
try {
img = ImageIO.read(new File("myLargeImage.jpg"));
} catch (IOException e) { /* ... */ }
int w = img.getWidth(), h = img.getHeight();
Для JGL может потребоваться преобразовать изображение в массив:
byte [][][] imageData = new byte[img.getWidth()][img.getHeight()][3]; // alloc buffer for RGB data
for(int y = 0; y < h; ++ y) {
for(int x = 0; x < w; ++ x) {
int RGBA = img.getRGB(x, y);
imageData[x][y][0] = RGBA & 0xff;
imageData[x][y][1] = (RGBA >> 8) & 0xff;
imageData[x][y][2] = (RGBA >> 16) & 0xff;
}
}
Обратите внимание, что также может быть альфа-канал (для прозрачности) и что он, вероятно, будет довольно медленным. Можно также использовать:
int[] rgbaData = img.GetRGB(0, 0, w, h, new int[w * h], 0, w);
Но это не возвращает данные в правильном формате, ожидаемом JGL. Вот незадача.
Тогда вам нужно заполнить текстуру:
int[] texId = {0};
gl.glGenTextures(1, texId); // generate texture id for your texture (can skip this line)
gl.glEnable(GL.GL_TEXTURE_2D);
gl.glBindTexture(GL.GL_TEXTURE_2D, texId[0]); // bind the texture
gl.glPixelStorei(GL.GL_UNPACK_ALIGNMENT, 1); // set alignment of data in memory (a good thing to do before glTexImage)
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); // set clamp (GL_CLAMP_TO_EDGE would be better)
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MIN_FILTER, GL.GL_LINEAR);
gl.glTexParameteri(GL.GL_TEXTURE_2D, GL.GL_TEXTURE_MAG_FILTER, GL.GL_LINEAR); // set linear filtering (so you can scale your image)
gl.glTexImage2D(GL.GL_TEXTURE_2D, 0, GL.GL_RGB, w, h, 0, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, imageData); // upload image data to the texture
Как только у вас есть текстура, вы можете рисовать вещи. Давайте пересмотрим ваше изображение:
int newW = ..., newH = ...; // fill-in your values
gl.glViewport(0, 0, newW, newH); // set viewport
gl.glMatrixMode(GL.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glMatrixMode(GL.GL_PROJECTION);
gl.glLoadIdentity();
gl.glColor3f(1.0f, 1.0f, 1.0f); // set "white" color
gl.glDisable(GL.GL_CULL_FACE); // disable backface culling
gl.glDisable(GL.GL_LIGHTING); // disable lighting
gl.glDisable(GL.GL_DEPTH_TEST); // disable depth test
// setup OpenGL so that it renders texture colors without modification (some of that is not required by default)
gl.glBegin(GL_QUADS);
gl.glTexCoord2f(0.0f, 1.0f);
gl.glVertex2f(-1.0f, -1.0f);
gl.glTexCoord2f(1.0f, 1.0f);
gl.glVertex2f(+1.0f, -1.0f);
gl.glTexCoord2f(1.0f, 0.0f);
gl.glVertex2f(+1.0f, +1.0f);
gl.glTexCoord2f(0.0f, 0.0f);
gl.glVertex2f(-1.0f, +1.0f);
gl.glEnd();
// draw a fullscreen quad with your texture on it (scaling is performed here)
Теперь, когда масштабированное изображение визуализировано, все, что нужно сделать, это загрузить его.
byte[][][] newImageData = new byte[newW][newH][3];
gl.glPixelStorei(GL.GL_PACK_ALIGNMENT, 1); // set alignment of data in memory (this time pack alignment; a good thing to do before glReadPixels)
gl.glReadPixels(0, 0, newW, newH, GL.GL_RGB, GL.GL_UNSIGNED_BYTE, newImageData);
И затем данные могут быть преобразованы в BufferedImage аналогичным образом, входное изображение img было преобразовано в imageData.
Обратите внимание, что я использовал переменную gl, которая является экземпляром класса GL. Поместите код в пример JGL, и он должен работать.
Одним словом, JGL, похоже, не поддерживает объекты кадрового буфера, так что вы ограничены размером выходного изображения размером вашего окна OpenGL (попытка создать большие изображения приведет к появлению черных границ). Эту проблему можно решить с помощью многопроходного рендеринга (визуализируйте ваш фрагмент изображения по фрагменту и соберите полное изображение в памяти).