Вопросы OpenGL + C#.Печать \ сохранение


можно ли как то распечатать содержимое simpleopenglcontrol?

можно ли как то сохранить содержимое simpleopenglcontrol в фаил?
  • 0
  • rembo
  • 23 октября 2010, 23:22

Вставка изображения

Комментарии (8)

rss свернуть / развернуть
  • avatar
  • Anvi
  • 23 октября 2010, 23:45
  • #
  • 0
Попробуй начать с
Bitmap bmp = new Bitmap(this.Width, this.Height);
this.DrawToBitmap(bmp,new Rectangle(0, 0, this.Width, this.Height));

bmp.save(...)

Правда я так не проверял, но по идее должно сработать (this это simpleopenglcontrol или форма окна)

свернуть ветку
нет, такой подход не подходит. Нужно использовать либо средства самого фреймворка тао. Либо сделать так: пройтись по всем точкам сцены, получить их цвет и перекопировать в picturebox и потом уже сам picturebox сохранять или печатать. Но для этого надо узнать какая ф-ия получает цвет по определенным координатам.

свернуть ветку
комментарий был удален
Ну тогда
void glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels);


Считывает пиксельные данные из прямоугольника буфера кадра, чей левый нижний угол находится в точке с оконными координатами (x, y), а ширина и высота равны width и height, и сохраняет его в массиве, на который указывает аргумент pixels. Аргумент format задает характер элементов пиксельных данных, которые должны быть считаны (величина индекса или величины R, G, B или A в соответствии с таблицей 8-1), а type задает тип данных для каждого элемента

свернуть ветку
  • avatar
  • rembo
  • 24 октября 2010, 15:13
  • #
  • 0
char[] buffer = new char[AnT.Width * AnT.Height * 3];
            Gl.glReadBuffer(Gl.GL_FRONT);
            Gl.glReadPixels(0, 0, AnT.Width, AnT.Height, Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, buffer);

            Graphics g = pictureBox1.CreateGraphics();
            for (int i=1; i<AnT.Width ; i++)
            {
                for (int j = 1; j < AnT.Height; j+=3)
            {
                g.FillRectangle(new SolidBrush(Color.FromArgb(255, buffer[j] % 255, buffer[j + 1] % 255, buffer[j + 2] % 255)), i, j, 1, 1);
            }
            }


вот так ковыряю(попытка перекинуть все пиксели в picturebox), но че не очень получился.

свернуть ветку
k96f9fz5k5tadzflikv.png


char[] buffer = new char[AnT.Width * AnT.Height * 3];
            Gl.glReadBuffer(Gl.GL_FRONT);
            Gl.glReadPixels(0, 0, AnT.Width, AnT.Height,
 Gl.GL_RGB, Gl.GL_UNSIGNED_BYTE, buffer);
            int a = 0;
            Graphics g = pictureBox1.CreateGraphics();
            for (int i=0; i<AnT.Width ; i++)
            {
                for (int j = 0; j < AnT.Height; j++)
            {              
                g.FillRectangle(new SolidBrush(Color.FromArgb(255,
 buffer[a] % 255,
 buffer[a + 1] % 255,
 buffer[a + 2] % 255)), 
i, j, 1, 1);
                a++;
                }
            }

свернуть ветку
Надо попробовать обратно записать буффер через glDrawBuffer.

Если будет все нормально — значит ошибка в

g.FillRectangle(new SolidBrush(Color.FromArgb(255,
 buffer[a] % 255,
 buffer[a + 1] % 255,
 buffer[a + 2] % 255)), 
i, j, 1, 1);


иначе в чтении буфера. (например стоит режим

Gl.glReadBuffer(Gl.GL_FRONT);


в то время как при инициализации у вас указано

Glut.glutInitDisplayMode(Glut.GLUT_RGB | Glut.GLUT_DOUBLE | Glut.GLUT_DEPTH);

свернуть ветку
Проверил сам, работает:
private Bitmap GetBitmap()
        {
            Gl.glFlush();
            Bitmap bitmap = new Bitmap(AnT.Width, AnT.Height+50);
            BitmapData bitmapData = bitmap.LockBits(
                new Rectangle(0, 0, bitmap.Width, bitmap.Height),
                ImageLockMode.WriteOnly, PixelFormat.Format24bppRgb);
            Gl.glReadBuffer(Gl.GL_FRONT);
            Gl.glReadPixels(0, 0, bitmap.Width, bitmap.Height,
                Gl.GL_BGR_EXT, Gl.GL_UNSIGNED_BYTE, bitmapData.Scan0);
            bitmap.UnlockBits(bitmapData);
            bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY);
            return bitmap;
        }

свернуть ветку
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.