Печать \ сохранение

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

можно ли как то сохранить содержимое simpleopenglcontrol в фаил?
0       1636        23.10.2010        7

0  
23.10.2010 00:00:00
Попробуй начать с
Bitmap bmp = new Bitmap(this.Width, this.Height);
this.DrawToBitmap(bmp,new Rectangle(0, 0, this.Width, this.Height));

bmp.save(...)

Правда я так не проверял, но по идее должно сработать (this это simpleopenglcontrol или форма окна)
0  
24.10.2010 00:00:00
нет, такой подход не подходит. Нужно использовать либо средства самого фреймворка тао. Либо сделать так: пройтись по всем точкам сцены, получить их цвет и перекопировать в picturebox и потом уже сам picturebox сохранять или печатать. Но для этого надо узнать какая ф-ия получает цвет по определенным координатам.
0  
24.10.2010 00:00:00
Ну тогда
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 задает тип данных для каждого элемента
0  
24.10.2010 00:00:00
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), но че не очень получился.
0  
24.10.2010 00:00:00



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++;
}
}
0  
24.10.2010 00:00:00
Надо попробовать обратно записать буффер через 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);
0  
26.01.2012 00:00:00
Проверил сам, работает:
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;
}
^