Войти
ПрограммированиеФорумГрафика

OpenGL: почему у меня получилась координата (0,0) - левый нижний угол? :)

#0
23:54, 10 июля 2009

Вот такой код я написал: http://paste.org.ru/?9bos4b
Я ещё чайник - не судите строго. Но почему-то в этом коде получилось так, что координата (0,0) получилась внизу слева.. А как бы её сделать вверху слева? а то непривычно как-то :)
С gluPerspective я никак не могу разобраться, сколько уже не пытался.. И картинки разные в гугле находил по этому делу - а всё никак :( Подозреваю, что именно эта функция является решением тут. Или нет?


#1
0:04, 11 июля 2009

Ты написал :
glTexCoord2f( 0.0, 0.0 ); glVertex2f( 0, 450 );
glTexCoord2f( 0.0, 1.0 ); glVertex2f( 630, 450 );
glTexCoord2f( 1.0, 1.0 ); glVertex2f( 630, 0 );
glTexCoord2f( 1.0, 0.0 ); glVertex2f( 0, 0 );

0,450 - это ведь и есть (внизу, слева). каждой парой команд texcoord/vertex2f ты задаешь соответствие экранной точки и точки из текстуры.  (вверху, слева ) на экране - это (0,0). поэкспериментируй с положением каждой из команд glVertex2F.

#2
0:49, 11 июля 2009

Э.. не, не тут-то было!

Вот сочинил туда:
-----------------
  glMatrixMode( GL_MODELVIEW );
  glLoadIdentity();

  glColor3f( 1, 1, 0 );
  glBegin( GL_LINES );
    glVertex2f( 0, 0 );
    glVertex2f( 500, 20 );
  glEnd();
-----------------
ВСЁ остальное в display я закомментил.

Смотрите как отобразилось: http://s42.radikal.ru/i095/0907/c5/0c18071efad9.png
какой-то прям низачёт опенгеелу :)

Как же у меня так получилось, что оси кверх тармашками стали?? Знаю, что потребуете мою фотку, чтобы посмотреть откуда руки растут, но всё же!!

#3
0:56, 11 июля 2009

Кстати, не подскажите ли ещё вот параллельный такой вопрос..

Вот код с этой линией: http://paste.org.ru/?54sf4r
Почему когда я откомменчиваю рисование текстуры на GL_QUAD (там закомменчен код) - то текстура отрисовывается, а поверх неё линия почему-то не рисуется.. почему?
Мне бы она нужна была.. :) А если закомменчиваю обратно - то линия рисуется. Вот она :) http://s42.radikal.ru/i095/0907/c5/0c18071efad9.png
Почему поверх не получается нарисовать?

#4
0:59, 11 июля 2009

Да всё в порядке с руками :) Так и задумано с координатами. Например, в OpenGL'е текстурные координаты по оси Y инвертированы по сравнению с DirectX.

Вообще тут http://www.glprogramming.com/red/chapter03.html#name3  написано про преобразования. Если же тебе просто надо вывести на экран изображение ("правильным" с твоей точки зрения образом), то просто подбери текстурные координаты и всё. Разве это сложно ? С любыми числами всегда такие проблемы.

P.S. Картинка с линией нормальная (ну да, y-координата инвертирована), просто проверь не только ModelView-матрицу (она-то единичная, это понятно), а и матрицу проекции (вдруг там top с bottom'ом перепутаны или ещё чего).

Пример с линией и проблема с текстурными координатами, озвученная в первом посте - это разные вещи.

#5
1:10, 11 июля 2009

Ну если инвертированы - то на -1 умножить по Y мне не сложно!

По поводу линии поверх текстуры - да, вещи конечно разные, ну может кто сможет сходу сказать чего тут не так. Не создавать же ради этого отдельную тему..

Вообще вопрос ещё по размерам структур.. заметно производительнее, если текстура размерами степени двойки? А у меня она 640х480 :D

#6
22:00, 11 июля 2009

Нарооод.. может подскажите почему у меня не получается рисовать поверх текстуры?

#7
22:10, 11 июля 2009
    glBegin( GL_QUADS );

        glTexCoord2f( 0.0, 0.0 ); glVertex2f( 0, 450 );
        glTexCoord2f( 0.0, 1.0 ); glVertex2f( 630, 450 );
        glTexCoord2f( 1.0, 1.0 ); glVertex2f( 630, 0 );
        glTexCoord2f( 1.0, 0.0 ); glVertex2f( 0, 0 );

    glEnd();
   
   /*========================*/
      glDisable( GL_DEPTH_TEST );
   /*========================*/

    glColor3f( 1, 1, 0 );
    glBegin( GL_LINES );
        glVertex2f( 0, 0 );
        glVertex2f( 500, 20 );
    glEnd();

   /*========================*/
      glEnable( GL_DEPTH_TEST );
   /*========================*/
#8
22:47, 11 июля 2009

Jamshoot, спасибо Вам огромное! Сработало!!
Линия по началу была на половину "прозрачной" (правда только серой и чёрной в зависимости от фоновой текстуры). Добавил отключение текстуры перед GL_DEPTH_TEST:
glDisable( GL_TEXTURE_2D );
glDisable( GL_DEPTH_TEST );
и всё сработало отлично!!

Финальный код на прорисовке (может кому окажется полезным) вот такой:
------------------------------------------------------------------
glMatrixMode( GL_MODELVIEW );
glLoadIdentity();

IplImage *image = cvQueryFrame( capture );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGB, image->width, image->height, 0, GL_BGR, GL_UNSIGNED_BYTE, image->imageData );

glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glEnable( GL_TEXTURE_2D );
glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE );
glBindTexture( GL_TEXTURE_2D, texName );

glBegin( GL_QUADS );

  glTexCoord2f( 0.0, 0.0 ); glVertex2f( 0, 450 );
  glTexCoord2f( 0.0, 1.0 ); glVertex2f( 630, 450 );
  glTexCoord2f( 1.0, 1.0 ); glVertex2f( 630, 0 );
  glTexCoord2f( 1.0, 0.0 ); glVertex2f( 0, 0 );

glEnd();

glDisable( GL_TEXTURE_2D );
glDisable( GL_DEPTH_TEST );

glColor3f( 1.0, 1.0, 0 );
glBegin( GL_LINES );
  glVertex2f( 0, 0 );
  glVertex2f( 500, 20 );
glEnd();

glutSwapBuffers();

glEnable( GL_DEPTH_TEST );
------------------------------------------------------------------

ПрограммированиеФорумГрафика

Тема в архиве.