Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Разная картинка OpenGL на Windows и Linux  (Прочитано 1455 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Разная картинка OpenGL на Windows и Linux
« : 15 Декабря 2013, 15:42:41 »
Здравствуйте.

Я пытаюсь сделать кроссплатформенное OpenGL-приложение. Собрал wxWidgets 3.0 под Windows (MinGW) и под "родную" ось.
Компилирую пример "куб" (cube) из wxWidgets-3.0.0/samples/opengl/cube под обе платформы, но результат почему-то разный:

Справа - скомпилированный под linux, слева - под windows (запущенный в Wine).

Пользователь решил продолжить мысль 15 Декабря 2013, 15:46:34:
На всякий случай, вот исходник.
main.cpp:
/////////////////////////////////////////////////////////////////////////////
// Name:        cube.cpp
// Purpose:     wxGLCanvas demo program
// Author:      Julian Smart
// Modified by:
// Created:     04/01/98
// RCS-ID:      $Id: cube.cpp 35650 2005-09-23 12:56:45Z MR $
// Copyright:   (c) Julian Smart
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"

#ifdef __BORLANDC__
#pragma hdrstop
#endif

#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif

#if !wxUSE_GLCANVAS
#error "OpenGL required: set wxUSE_GLCANVAS to 1 and rebuild the library"
#endif

#include "main.h"
#include "sample.xpm"

#ifndef __WXMSW__     // for StopWatch, see remark below
#if defined(__WXMAC__) && !defined(__DARWIN__)
#include <utime.h>
#include <unistd.h>
#else
#include <sys/time.h>
#include <sys/unistd.h>
#endif
#else
#include <sys/timeb.h>
#endif

/*----------------------------------------------------------------------
Utility function to get the elapsed time (in msec) since a given point
in time (in sec)  (because current version of wxGetElapsedTime doesnґt
works right with glibc-2.1 and linux, at least for me)
-----------------------------------------------------------------------*/
unsigned long StopWatch( unsigned long *sec_base )
{
  unsigned long secs,msec;

  #if defined(__WXMSW__)
  struct timeb tb;
  ftime( &tb );
  secs = tb.time;
  msec = tb.millitm;
  #elif defined(__WXMAC__) && !defined(__DARWIN__)
  wxLongLong tl = wxGetLocalTimeMillis();
  secs = (unsigned long) (tl.GetValue() / 1000);
  msec = (unsigned long) (tl.GetValue() - secs*1000);
  #else
  // think every unice has gettimeofday
  struct timeval tv;
  gettimeofday( &tv, (struct timezone *)NULL );
  secs = tv.tv_sec;
  msec = tv.tv_usec/1000;
  #endif

  if( *sec_base == 0 )
  *sec_base = secs;

  return( (secs-*sec_base)*1000 + msec );
}

/*----------------------------------------------------------------
Implementation of Test-GLCanvas
-----------------------------------------------------------------*/

BEGIN_EVENT_TABLE(TestGLCanvas, wxGLCanvas)
  EVT_SIZE(TestGLCanvas::OnSize)
  EVT_PAINT(TestGLCanvas::OnPaint)
  EVT_ERASE_BACKGROUND(TestGLCanvas::OnEraseBackground)
  EVT_ENTER_WINDOW( TestGLCanvas::OnEnterWindow )
END_EVENT_TABLE()

unsigned long  TestGLCanvas::m_secbase = 0;
int            TestGLCanvas::m_TimeInitialized = 0;
unsigned long  TestGLCanvas::m_xsynct;
unsigned long  TestGLCanvas::m_gsynct;

TestGLCanvas::TestGLCanvas(wxWindow *parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
                          : wxGLCanvas(parent, (wxGLCanvas*) NULL, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE , name )
{
  m_init = false;
  m_gllist = 0;
}

TestGLCanvas::TestGLCanvas(wxWindow *parent, const TestGLCanvas *other, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
                          : wxGLCanvas(parent, other->GetContext(), id, pos, size, style|wxFULL_REPAINT_ON_RESIZE , name)
{
  m_init = false;
  m_gllist = other->m_gllist; // share display list
}

TestGLCanvas::~TestGLCanvas()
{
}

void TestGLCanvas::Render()
{
  wxPaintDC dc(this);

  #ifndef __WXMOTIF__
  if (!GetContext()) return;
  #endif

  SetCurrent();
  // Init OpenGL once, but after SetCurrent
  if (!m_init)
  {
    InitGL();
    m_init = true;
  }

  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();
  glFrustum(-0.5f, 0.5f, -0.5f, 0.5f, 1.0f, 3.0f);
  glMatrixMode(GL_MODELVIEW);

  /* clear color and depth buffers */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  if( m_gllist == 0 )
  {
    m_gllist = glGenLists( 1 );
    glNewList( m_gllist, GL_COMPILE_AND_EXECUTE );
    /* draw six faces of a cube */
    glBegin(GL_QUADS);
    glNormal3f( 0.0f, 0.0f, 1.0f);
    glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);
    glVertex3f(-0.5f,-0.5f, 0.5f); glVertex3f( 0.5f,-0.5f, 0.5f);

    glNormal3f( 0.0f, 0.0f,-1.0f);
    glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f(-0.5f, 0.5f,-0.5f);
    glVertex3f( 0.5f, 0.5f,-0.5f); glVertex3f( 0.5f,-0.5f,-0.5f);

    glNormal3f( 0.0f, 1.0f, 0.0f);
    glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f( 0.5f, 0.5f,-0.5f);
    glVertex3f(-0.5f, 0.5f,-0.5f); glVertex3f(-0.5f, 0.5f, 0.5f);

    glNormal3f( 0.0f,-1.0f, 0.0f);
    glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f( 0.5f,-0.5f,-0.5f);
    glVertex3f( 0.5f,-0.5f, 0.5f); glVertex3f(-0.5f,-0.5f, 0.5f);

    glNormal3f( 1.0f, 0.0f, 0.0f);
    glVertex3f( 0.5f, 0.5f, 0.5f); glVertex3f( 0.5f,-0.5f, 0.5f);
    glVertex3f( 0.5f,-0.5f,-0.5f); glVertex3f( 0.5f, 0.5f,-0.5f);

    glNormal3f(-1.0f, 0.0f, 0.0f);
    glVertex3f(-0.5f,-0.5f,-0.5f); glVertex3f(-0.5f,-0.5f, 0.5f);
    glVertex3f(-0.5f, 0.5f, 0.5f); glVertex3f(-0.5f, 0.5f,-0.5f);
    glEnd();

    glEndList();
  }
  else
  {
    glCallList(m_gllist);
  }

  glFlush();
  SwapBuffers();
}

void TestGLCanvas::OnEnterWindow( wxMouseEvent& WXUNUSED(event) )
{
  SetFocus();
}

void TestGLCanvas::OnPaint( wxPaintEvent& WXUNUSED(event) )
{
  Render();
}

void TestGLCanvas::OnEraseBackground(wxEraseEvent& WXUNUSED(event))
{
  // Do nothing, to avoid flashing.
}

void TestGLCanvas::InitGL()
{
  SetCurrent();

  /* set viewing projection */
  glMatrixMode(GL_PROJECTION);
  glFrustum(-0.5f, 0.5f, -0.5f, 0.5f, 1.0f, 3.0f);

  /* position viewer */
  glMatrixMode(GL_MODELVIEW);
  glTranslatef(0.0f, 0.0f, -2.0f);

  /* position object */
  glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
  glRotatef(30.0f, 0.0f, 1.0f, 0.0f);

  glEnable(GL_DEPTH_TEST);
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
}

BEGIN_EVENT_TABLE(MyFrame, wxFrame)
  EVT_MENU(wxID_EXIT, MyFrame::OnExit)
END_EVENT_TABLE()

// My frame constructor
MyFrame::MyFrame(wxWindow *parent, const wxString& title, const wxPoint& pos, const wxSize& size, long style)
        : wxFrame(parent, wxID_ANY, title, pos, size, style)
{
  m_canvas = NULL;
  SetIcon(wxIcon(sample_xpm));
}

// Intercept menu commands
void MyFrame::OnExit( wxCommandEvent& WXUNUSED(event) )
{
  // true is to force the frame to close
  Close(true);
}

/*static*/ MyFrame *MyFrame::Create(MyFrame *parentFrame, bool isCloneWindow)
{
  wxString str = wxT("wxWidgets OpenGL Cube Sample");
  if (isCloneWindow) str += wxT(" - Clone");

  MyFrame *frame = new MyFrame(NULL, str, wxDefaultPosition,
  wxSize(400, 300));

  // Make a menubar
  wxMenu *winMenu = new wxMenu;

  winMenu->Append(wxID_EXIT, _T("&Close"));
  wxMenuBar *menuBar = new wxMenuBar;
  menuBar->Append(winMenu, _T("&Window"));

  frame->SetMenuBar(menuBar);

  if (parentFrame)
  {
    frame->m_canvas = new TestGLCanvas( frame, parentFrame->m_canvas,
    wxID_ANY, wxDefaultPosition, wxDefaultSize );
  }
  else
  {
    frame->m_canvas = new TestGLCanvas(frame, wxID_ANY,
    wxDefaultPosition, wxDefaultSize);
  }

  // Show the frame
  frame->Show(true);

  return frame;
}

IMPLEMENT_APP(MyApp)

bool MyApp::OnInit()
{
  MyFrame::Create(NULL);

  return true;
}
main.h:
/////////////////////////////////////////////////////////////////////////////
// Name:        cube.h
// Purpose:     wxGLCanvas demo program
// Author:      Julian Smart
// Modified by:
// Created:     04/01/98
// RCS-ID:      $Id: cube.h 33105 2005-03-27 18:08:08Z VZ $
// Copyright:   (c) Julian Smart
// Licence:     wxWindows licence
/////////////////////////////////////////////////////////////////////////////

#ifndef _WX_CUBE_H_
#define _WX_CUBE_H_

#include "wx/glcanvas.h"

// Define a new application type
class MyApp: public wxApp
{
public:
  bool OnInit();
};

// Define a new frame type
class TestGLCanvas;

class MyFrame: public wxFrame
{
public:
  static MyFrame *Create(MyFrame *parentFrame, bool isCloneWindow = false);
  void OnExit(wxCommandEvent& event);

private:
  MyFrame(wxWindow *parent, const wxString& title, const wxPoint& pos,
  const wxSize& size, long style = wxDEFAULT_FRAME_STYLE);

  TestGLCanvas *m_canvas;

  DECLARE_EVENT_TABLE()
};

#if wxUSE_GLCANVAS

class TestGLCanvas: public wxGLCanvas
{
  friend class MyFrame;
public:
  TestGLCanvas( wxWindow *parent, wxWindowID id = wxID_ANY,
  const wxPoint& pos = wxDefaultPosition,
  const wxSize& size = wxDefaultSize,
  long style = 0, const wxString& name = _T("TestGLCanvas") );

  TestGLCanvas( wxWindow *parent, const TestGLCanvas *other,
  wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition,
  const wxSize& size = wxDefaultSize, long style = 0,
  const wxString& name = _T("TestGLCanvas") );

  ~TestGLCanvas();

  void OnPaint(wxPaintEvent& event);
  void OnEraseBackground(wxEraseEvent& event);
  void OnEnterWindow(wxMouseEvent& event);

  void Render();
  void InitGL();

private:
  bool   m_init;
  GLuint m_gllist;

  static unsigned long  m_secbase;
  static int            m_TimeInitialized;
  static unsigned long  m_xsynct;
  static unsigned long  m_gsynct;

  unsigned long  m_StartTime;
  unsigned long  m_LastTime;
  unsigned long  m_LastRedraw;

  DECLARE_EVENT_TABLE()
};

#endif // #if wxUSE_GLCANVAS

#endif // #ifndef _WX_CUBE_H_
« Последнее редактирование: 15 Декабря 2013, 16:47:30 от sooqua »

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #1 : 15 Декабря 2013, 16:27:53 »
sooqua, а под реальной виндой как работает? Wine далеко не показатель...

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #2 : 15 Декабря 2013, 16:31:38 »
sooqua, а под реальной виндой как работает? Wine далеко не показатель...
« Последнее редактирование: 16 Декабря 2013, 15:00:23 от sooqua »

Оффлайн quiet_readonly

  • Участник
  • *
  • Сообщений: 133
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #3 : 16 Декабря 2013, 22:38:12 »
В InitGL стоило бы обнулять матрицы через glLoadIdentity.

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 15568
  • Глухонемой (Deaf)
    • Просмотр профиля
Wars ~.o

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #5 : 17 Декабря 2013, 15:36:45 »
http://esate.ru/blog/novye_uroki_opengl/187.html
Не получилось у меня glut к mingw+wxWidgets подключить. А что вообще из этого урока я должен был подчерпнуть, чтобы исправить проблему?
В InitGL стоило бы обнулять матрицы через glLoadIdentity.
Спасибо, попробую

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #6 : 19 Декабря 2013, 16:10:01 »
Ничего не изменилось от glLoadIdentity()

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #7 : 23 Декабря 2013, 18:57:49 »
бамп

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #8 : 01 Января 2014, 01:22:32 »
никто не поможет :-\

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #9 : 01 Января 2014, 04:20:30 »
sooqua, в винде нормально, а в Ubuntu нет?

Оффлайн sooqua

  • Автор темы
  • Любитель
  • *
  • Сообщений: 65
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #10 : 01 Января 2014, 13:04:04 »
да

Оффлайн peregrine

  • FSM
  • СуперМодератор
  • Старожил
  • *
  • Сообщений: 7215
  • Gentoo x64 Ubuntu 16.04.1 x64
    • Просмотр профиля
Re: Разная картинка OpenGL на Windows и Linux
« Ответ #11 : 02 Января 2014, 15:39:03 »
sooqua, а дай вывод
lspci -k | egrep 'VGA|3D' -A2

 

Страница сгенерирована за 0.022 секунд. Запросов: 21.