Вопросы OpenGL + C#.Запуск программ из OpenGL Red Book в Tao Framework + С#


Здравствуйте, поробовал переделать программу из руководства по программированию без корректной реакции на изменение размеров окна, но на экран ничего не выводится: он даже не очищается в заданный цвет. В чем может быть проблема?
Вот исходный код из книжки ( листинг 2-5):


#define drawOneLine(x1,y1,x2,y2) glBegin(GL_LINES);glVertex2f((x1),(y1));glVertex2f((x2),(y2));glEnd();

void init(void)
{
   glClearColor(1.0,1.0,1.0,0.0);
   glShadeModel(GL_FLAT);
}
 
void display(void)
{
   int i;
 
   glClear(GL_COLOR_BUFFER_BIT);

   //Черный цвет для всех линий
   glColor3f(0.0,0.0,0.0);

   glEnable(GL_LINE_STIPPLE);

   //В первом ряду три линии с разными шаблонами
   glLineWidth(1.0);
   glLineStipple(1,0x0101); //Пунктирная
   drawOneLine(50.0,125.0,150.0,125.0);
   glLineStipple(1,0x00FF); //Штриховая
   drawOneLine(150.0,125.0,250.0,125.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   drawOneLine(250.0,125.0,350.0,125.0);

   //Во втором ряду три толстые линии с аналогичными шаблонами
   glLineWidth(5.0);
   glLineStipple(1,0x0101); //Пунктирная
   drawOneLine(50.0,100.0,150.0,100.0);
   glLineStipple(1,0x00FF); //Штриховая
   drawOneLine(150.0,100.0,250.0,100.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   drawOneLine(250.0,100.0,350.0,100.0);
 
   //В третьем ряду шесть штрих-пунктирных линий, объединенных в ломаную
   glLineWidth(1.0);
   glLineStipple(1,0x1C47); //Штрих-пунктирная
   glBegin(GL_LINE_STRIP);
   for (i=0;i<7;i++)
      glVertex2f(50.0+((GLfloat)i*50.0),75.0);
   glEnd();

   //В четвертом ряду шесть независимых линий того же шаблона
   for (i=0;i<6;i++)
   {
      drawOneLine(50.0+((GLfloat)i*50.0),50.0,50.0+((GLfloat)(i+1)*50.0),50.0);
   }

   //В пятом ряду 1 штрих-пунктирная линия с фактором повторения=5
   glLineStipple(5,0x1c47);
   drawOneLine(50.0,25.0,350.0,25.0);
 
   glDisable(GL_LINE_STIPPLE);
   glFlush();
}
 
void reshape(int w,int h)
{
   glViewport(0,0,(GLsizei) w, (GLsizei) h);
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
   gluOrtho2D(0.0,400.0,0.0,150.0);
}
 
int main(int argc, char **argv)
{
   glutInit(&argc,argv);
   glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
   glutInitWindowSize(400,150);
   glutInitWindowPosition(100,100);
   glutCreateWindow("Line Stipple Patterns");
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
}


Как переделал (WindowsFormApplication по аналогии уроков с сайта)

namespace _2_5_
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            AnT.InitializeContexts();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // инициализация библиотеки GLUT 
            Glut.glutInit();
            // инициализация режима окна 

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

            // устанавливаем цвет очистки окна 
            Gl.glClearColor(255, 255, 255, 1);

        //    Gl.glShadeModel(Gl.GL_FLAT);

            // устанавливаем порт вывода, основываясь на размерах    элемента управления AnT 
            Gl.glViewport(0, 0, AnT.Width, AnT.Height);

            // устанавливаем проекционную матрицу 
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            // очищаем ее 
            Gl.glLoadIdentity();         

            Glu.gluOrtho2D(0.0, AnT.Width, 0.0, AnT.Height);
     
            timer1.Start();

        }

        private void drawOneLine(double x1, double y1, 
         double x2,     double y2)
        {
            Gl.glBegin(Gl.GL_LINES);
            Gl.glVertex2d(x1, y1);
            Gl.glVertex2d(x2, y2);
            Gl.glEnd();
        }

        private void Draw()
        {
            int i;
            // Очищаем буфер цвета
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);

            Gl.glColor3d(0.0, 0.0, 0.0);

            Gl.glEnable(Gl.GL_LINE_STIPPLE);

            Gl.glLineWidth((float)1.0);
            Gl.glLineStipple(1, 0x0101);
            drawOneLine(50.0, 125.0, 150.0, 125.0);
            Gl.glLineStipple(1, 0x00FF); //Штриховая
            drawOneLine(150.0, 125.0, 250.0, 125.0);
            Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
            drawOneLine(250.0, 125.0, 350.0, 125.0);

            //Во втором ряду три толстые 
            // линии с аналогичными шаблонами
            Gl.glLineWidth((float)5.0);
            Gl.glLineStipple(1, 0x0101); //Пунктирная
            drawOneLine(50.0, 100.0, 150.0, 100.0);
            Gl.glLineStipple(1, 0x00FF); //Штриховая
            drawOneLine(150.0, 100.0, 250.0, 100.0);
            Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
            drawOneLine(250.0, 100.0, 350.0, 100.0);

            //В третьем ряду шесть штрих-пунктирных линий,
            //    объединенных в ломаную
            Gl.glLineWidth((float)1.0);
            Gl.glLineStipple(1, 0x1C47); //Штрих-пунктирная
            Gl.glBegin(Gl.GL_LINE_STRIP);
            for (i = 0; i < 7; i++)
                Gl.glVertex2d(50.0 + ((float)i * 50.0), 75.0);
            Gl.glEnd();
            Gl.glFlush();

            AnT.Invalidate();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            Draw();
        }
    }
}
  • 0
  • ZaoTin
  • 29 августа 2010, 00:44

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

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

rss свернуть / развернуть
комментарий был удален
  • avatar
  • Anvi
  • 29 августа 2010, 01:18
  • #
  • 0
хм… Что то я сначала совсем не то подумал и не то ответил :) Утром постараюсь глянуть )

свернуть ветку
  • avatar
  • Anvi
  • 29 августа 2010, 10:56
  • #
  • 0
Опытным путем было определено, что таймер не стартует из функции Form1_Load
Чтобы решить проблему, надо сразу поставить в настройках таймера enabled — true.

Самое интересное, что ранее я никогда не встречался с этой проблемой, хотя в нескольких уроках таймер инициализировался именно в функции Form1_Load.

Надо будет почитать документацию по классу Timer. Мне кажется что проблема либо в том, что у меня всегда был enabled таймер (и я проглядел такую серьезную ошибку), либо дело в том, что до недавнего времени у меня стояла VS 2008 SP1, сейчас просто VS 2008 — и это баг.

свернуть ветку
Блин, оказалось что я не поставил тип проекта в х86 ( Windows 7 x64, MVS 2008 sp1), так стало работать.=). Таймер стартует из Form1_Load и при enabled — true, и при enabled — false. =)

свернуть ветку
Обычно, если не стоит x86, а ось x64, то после компиляции вообще валится приложение, а вопрос был в неработающем рендере :)

Кстати, у меня проблема с таймером пока осталась актуальной. Надо поставить VS с SP1, что-то мне кажется тут собака зарыта :)

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