#include const int checkImageWidth = 256; const int checkImageHeight = 256; GLubyte checkImage[checkImageHeight][checkImageWidth]; static int x_pos, y_pos, x_0, y_0; static bool flag; void Init(void) { glClearColor(0.0, 0.0, 0.0, 0.0); // Формирование растра с градиентной заливкой for (int i = 0; i < checkImageHeight; i++) { for (int j = 0; j < checkImageWidth; j++) { checkImage[i][j] = (i + j) / 2.; } } glPixelStorei(GL_UNPACK_ALIGNMENT, 1); x_pos = -checkImageWidth / 2; y_pos = -checkImageHeight / 2; flag = false; } void Reshape(int w, int h) { glViewport(0, 0, (GLsizei)w, (GLsizei)h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(-w / 2., w / 2., -h / 2., h / 2.); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } void Motion(int x, int y) { if (flag) { x_pos += (x - x_0); y_pos += (y_0 - y); x_0 = x; y_0 = y; glutPostRedisplay(); } } void Mouse(int button, int state, int x, int y) { if (button == GLUT_LEFT_BUTTON) { if (state == GLUT_DOWN) { flag = true; x_0 = x; y_0 = y; } else { flag = false; } } } void Draw(void) { glClear(GL_COLOR_BUFFER_BIT); //Запомнить атрибут glPushAttrib(GL_CURRENT_BIT); //Вычислить предварительное положение начала вывода битового массива double x, y, z; //Видовая матрица GLdouble modelMatrix[16]; glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); //Матрица проекций GLdouble projMatrix[16]; glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); //Координаты области вывода GLint viewport[4]; glGetIntegerv(GL_VIEWPORT, viewport); gluUnProject(viewport[0] + 1, viewport[1] + 1, 0, modelMatrix, projMatrix, viewport, &x, &y, &z); int dx, dy; dx = dy = 0; int xp, yp; xp = x_pos; yp = y_pos; if (y_pos < y) { dy = y - y_pos; yp = y; } if (x_pos < x) { dx = x - x_pos; xp = x; } //Установить положение начала вывода битового массива glRasterPos2f(xp, yp); //Задать атрибуты вывода пикселов glPixelStorei(GL_UNPACK_ROW_LENGTH, checkImageWidth); //длина строки glPixelStorei(GL_UNPACK_SKIP_ROWS, dy); // сколько строк пропустить? glPixelStorei(GL_UNPACK_SKIP_PIXELS, dx); // сколько пикселов пропустить в каждой строке? //Отобразить пикселы на экране glDrawPixels(checkImageWidth - dx, checkImageHeight - dy, GL_LUMINANCE, GL_UNSIGNED_BYTE, checkImage); //Вернуть исходные значения атрибутам вывода glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); //Вернуть атрибут glPopAttrib(); glFlush(); glutSwapBuffers(); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(512, 512); glutInitWindowPosition(100, 100); glutCreateWindow("Raster Test"); Init(); glutDisplayFunc(Draw); glutReshapeFunc(Reshape); glutMotionFunc(Motion); glutMouseFunc(Mouse); glutMainLoop(); return 0; }