На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела "Программирование графики"
1) Данный раздел предназначен для обсуждения проблем, возникающих при программировании задач, связанных с чтением, сохранением, обработкой, созданием, отрисовкой графической информации (в том числе - 3D [OpenGL, Direct3D] и анимации [в т.ч. VFW, DirectShow, OpenDML]).
Флэш обсуждают здесь!.

2) Если вы хотите получить совет для конкретной платформы/языка программирования, обязательно укажите их в вопросе.

3) Уважаемые новички! Мы приветствуем Ваше желание научить всех посетителей раздела правильному программированию. Но огромная просьба, перед тем, как писать поучения в старых (последний ответ - "старее" месяца, а особенно, если вопрошавший не появляется на форуме уже не первый месяц, в чем можно убедиться в его профиле) темах, хорошо подумать, будет ли кому-нибудь, кроме Вас cамих, это интересно.



Ваше мнение о модераторах: user posted imageBarazuk, user posted imageOpenGL, user posted imageMikle
Модераторы: OpenGL, Mikle
  
> Blending , OpenGL
    Делаю полупрозрачный объект, используя
    ExpandedWrap disabled
          glEnable(GL_BLEND);
          glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    При вращении объекта получаются артефакты.
    Прикреплённая картинка
    Прикреплённая картинка

    Что нужно сделать чтобы не было таких полосок при "перекладывании" из одного положения в другое ?
    Сообщение отредактировано: F0X -
      Вращение из положения 1 в положение 2 на рисунке
      Прикреплённая картинка
      Прикреплённая картинка
      Прикреплённая картинка
      Прикреплённая картинка


      Добавлено
      Сообщение отредактировано: F0X -
        Тоже самое происходит в цвете
        Прикреплённая картинка
        Прикреплённая картинка
          Выглядит как Z-fighting, как будто что-то напутано в матрице проекции и при некоторых направлениях zNear/zFar стремится к нулю.
            При вращении непрозрачного объекта
            ExpandedWrap disabled
                  glDisable(GL_BLEND);

            все отлично, изображение не искажается
            Что-то всязано именно с функцией
            ExpandedWrap disabled
              glBlendFunc()
            Сообщение отредактировано: F0X -
              Z-fighting может влиять на порядок отрисовки, а при выключенном блендинге порядок не важен.
              А как ты рисуешь обратные стороны? Просто отключи куллинг, или в два прохода, сначала с cull_cw, потом с cull_ccw? Что с настройками Z-буфера?
                ExpandedWrap disabled
                  void ThreedviewInitialize()
                  {
                      glShadeModel(GL_SMOOTH);
                      glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
                      glClearDepth(1.0f);
                      glEnable(GL_DEPTH_TEST);
                      glDepthFunc(GL_LEQUAL);
                      glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
                  }


                ExpandedWrap disabled
                  void ThreedviewPaint(HWND hwnd)
                  {
                      PAINTSTRUCT ps;
                      BeginPaint(hwnd, &ps);
                      EndPaint(hwnd, &ps);
                      glMatrixMode(GL_MODELVIEW);
                      glLoadIdentity();
                      glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
                      glEnable(GL_COLOR_MATERIAL);
                      //
                      float light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };
                      float light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };
                      float light_specular[] = { 1.0, 1.0, 1.0, 1.0 };
                      float light_position[] = { -1.0, 1.0, 1.0, 0.0 };
                      //
                      float mat1_dif[]={0.0f,0.0f,0.0f};
                      float mat1_amb[]= {0.2f,0.2f,0.2f};
                      float mat1_spec[]={0.6f,0.6f,0.6f};
                      float mat1_shininess=10.0;
                   
                      //float mat1_dif[]={0.8f,0.8f,0.0f};
                      //float mat1_amb[]= {0.2f,0.2f,0.2f};
                      //float mat1_spec[]={0.6f,0.6f,0.6f};
                      //float mat1_shininess=0.5f*128;
                      //
                      glEnable (GL_LIGHTING);
                      glEnable (GL_LIGHT0);
                      glEnable(GL_NORMALIZE);
                      //
                      glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
                      glEnable(GL_BLEND);
                      glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                      //
                      glLoadMatrixf(e::threedviewpaintmatrix[1]);
                      //
                      ThreedviewPaintCoordinateSystem();
                      ThreedviewPaintElement();
                      //
                      glMaterialfv (GL_FRONT,GL_AMBIENT,mat1_amb);
                      glMaterialfv (GL_FRONT,GL_DIFFUSE,mat1_dif);
                      glMaterialfv (GL_FRONT,GL_SPECULAR,mat1_spec);
                      glMaterialf  (GL_FRONT,GL_SHININESS,mat1_shininess);
                      //
                      glLightfv (GL_LIGHT0, GL_AMBIENT, light_ambient);
                      glLightfv (GL_LIGHT0, GL_DIFFUSE, light_diffuse);
                      glLightfv (GL_LIGHT0, GL_SPECULAR, light_specular);
                      glLoadIdentity();
                      glLightfv (GL_LIGHT0, GL_POSITION, light_position);
                      //
                      glDisable(GL_COLOR_MATERIAL);
                      glDisable(GL_LIGHTING);
                      glDisable(GL_LIGHT0);
                      glDisable(GL_NORMALIZE);
                      glDisable(GL_BLEND);
                  }


                ExpandedWrap disabled
                  void ThreedviewPaintElement()
                  {
                      int i;
                      for (i=0; i<e::threedviewelementubound; i++)
                      {
                          switch ((int)e::threedviewelement[i][0])
                          {
                          case 2:
                              ThreedviewPaintElementShaft(i);
                              break;
                          }
                      }
                  }
                   
                  void ThreedviewPaintElementShaft(GLint param)
                  {
                      int i, sec;
                      float x1, y1, z1, d1, d2, d3, d4, h1;
                      GLUquadricObj *q;
                      glPushMatrix();
                      q = gluNewQuadric();
                      glColor4f(0.5f, 0.5f, 0.5f, 0.8f);
                      //glColor4f(0.3f, 0.3f, 1.0f, 0.8f);
                      //
                      x1 = e::threedviewelement[param][1];
                      y1 = e::threedviewelement[param][2];
                      z1 = e::threedviewelement[param][3];
                      sec = (int) e::threedviewelement[param][7];
                      glTranslatef(x1, y1, z1);
                      for (i=0; i<sec; i++)
                      {
                          if (i == 0)
                          {
                              d1 = e::threedviewelement[param][7+i*3+1];
                              d2 = e::threedviewelement[param][7+i*3+2];
                              h1 = e::threedviewelement[param][7+i*3+3];
                              gluDisk(q, d1, d2, 100, 100);
                              gluCylinder(q, d1, d1, h1, 100, 100);
                              gluCylinder(q, d2, d2, h1, 100, 100);
                              glTranslatef(0.0f, 0.0f, h1);
                              if (sec == 1)
                              {
                                  gluDisk(q, d1, d2, 100, 100);
                              }
                          }
                          else
                          {
                              d1 = e::threedviewelement[param][7+(i-1)*3+1];
                              d2 = e::threedviewelement[param][7+(i-1)*3+2];
                              d3 = e::threedviewelement[param][7+i*3+1];
                              d4 = e::threedviewelement[param][7+i*3+2];
                              h1 = e::threedviewelement[param][7+i*3+3];
                              gluDisk(q, d1, d3, 100, 100);
                              gluDisk(q, d2, d4, 100, 100);
                              gluCylinder(q, d3, d3, h1, 100, 100);
                              gluCylinder(q, d4, d4, h1, 100, 100);
                              glTranslatef(0.0f, 0.0f, h1);
                              if (i == (sec-1))
                              {
                                  gluDisk(q, d3, d4, 100, 100);
                              }
                          }
                      }
                      gluDeleteQuadric(q);
                      glPopMatrix();
                  }


                Добавлено
                Здесь ThreedviewPaintElementShaft() это рисование ступенчатого вала
                  Цитата
                  Просто отключи куллинг

                  Если я правильно понимаю, это направление обхода по часовой или против часовой стрелки.
                  Попробовал разные варианты
                  Прикреплённая картинка
                  Прикреплённая картинка

                  Но z-конфликт все равно есть
                  Сообщение отредактировано: F0X -
                    Вот такая последовательность действий решила проблему
                    ExpandedWrap disabled
                          glEnable(GL_CULL_FACE);
                      //...
                          glCullFace(GL_BACK);
                          ThreedviewPaintElement();
                          glCullFace(GL_FRONT);
                          ThreedviewPaintElement();
                      //...
                          glDisable(GL_CULL_FACE);

                    Mikle Спасибо за подсказку
                      У меня, кстати, там опечатка была:
                      Цитата Mikle @
                      Просто отключи куллинг

                      Должно было быть "отключив" :), это же вопросительное предложение.
                      Вижу, два прохода с разным куллингом действительно решили проблему.
                      Сообщение отредактировано: Mikle -
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0552 ]   [ 23 queries used ]   [ Generated: 28.03.24, 12:48 GMT ]