LINUX.ORG.RU

Использование OpenGL в MonoDevelop

 , , , tao


0

2

Здравствуйте! Появилась необходимость поработать с графическими библиотеками. Под Windows все ясно - поставил DirectX, добавил нужные либы от него в VS, почитал MSDN и в принципе сиди и пиши код, но вот в Linux... Немного почитал маны по Tao Framework - вроде бы то, что нужно, открыл официальную справку по работе с ним в MonoDevelop(http://www.mono-project.com/Tao) и ничего понять не смог, в частности: судя по датам, последний релиз указанной библиотеки был еще 7 лет назад[1.2.0 Release (2 Nov 2005)]. Начал искать хоть какие-то мануалы для Tao на русском, нашел следующее(http://esate.ru/page/chto-takoe-tao-framework), но тут про то, как его использовать в Windows, какие проблемы создало MS разработчикам графических либ, отличных от DirectX и т.д. Наверняка кто-нибудь из Вас хоть раз, хоть мельком знакомился с применением графических библиотек и разработкой 3D-приложений в Linux(MonoDevelop/C#). Прошу подсказать как это вообще делается, какие достойные книги и ресурсы есть по этому поводу?


Не понял, что вам нужно. Но если вы под windows использовали directx, то почему бы под linux (и не только) не использовать opengl?

andreyu ★★★★★
()
Ответ на: комментарий от andreyu

Судя по тому, что я понял на MonoProject, Tao - это есть не более чем обертка над OpenGL.

Сейчас скачал с SourceForge указанную библиотеку, подключил её к своему проекту(всмысле прицепил DLL), начинаю инициализацию указанной либы и пытаюсь её использовать:

	public MyGraphicProgram () : base(Gtk.WindowType.Toplevel)
	{
		this.Build ();
		//для отладки
		StartGl();
	}

	public void StartGl()
	{
		InitGlutScreen(800, 800, "Hello World");
            InitGlutWireEvents();
            Glut.glutMainLoop();
	}


	private void InitGlutScreen(int width, int height, string title)
        {
            Glut.glutInit();
            Glut.glutInitDisplayMode(Glut.GLUT_SINGLE | Glut.GLUT_RGB);
            Glut.glutInitWindowSize(width, height);
            Glut.glutCreateWindow(title);
                        Gl.glClearDepth(1.0f);
            InitGl();
        }

	private void InitGl()
        {
            Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
            Gl.glMatrixMode(Gl.GL_PROJECTION);
            Gl.glOrtho(0, 1, 0, 1, -1, 1);
        }

        private void InitGlutWireEvents()
        {
            Glut.glutDisplayFunc(new Glut.DisplayCallback(Display));
            Glut.glutKeyboardFunc(new Glut.KeyboardCallback(Keyboard));
            Glut.glutReshapeFunc(new Glut.ReshapeCallback(Reshape));
            Glut.glutMouseFunc(new Glut.MouseCallback(Mouse));
            Glut.glutMotionFunc(new Glut.MotionCallback(Motion));
        }

        private static void Display()
        {
            Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
            Gl.glBegin(Gl.GL_POLYGON);
            Gl.glVertex3f(0.25f, 0.25f, 0f);
            Gl.glVertex3f(0.75f, 0.25f, 0f);
            Gl.glVertex3f(0.25f, 0.75f, 0f);
            Gl.glVertex3f(0.75f, 0.75f, 0f);
            Gl.glEnd();
            Gl.glFlush();
        }

	private static void Keyboard(byte key, int x, int y)
        {
            switch (key)
            {
                case 27: //this is the ESC key
                    Environment.Exit(0);
                    break;
            }
        }

        private static void Mouse(int button, int state, int x, int y)
        {

        }
        private static void Motion(int x, int y)
        {

        }
        private static void Reshape(int w, int h)
        {

        }
но получаю абсолютно не информативный MessageDialog с коротким сообщением: «freeglut.dll». Как понимаю, подцепленая к проекту DLL обращается к графической библиотеке, точнее сказать, к файлу графической библиотеки «freeglut.dll», который не установлен. Понять не могу как работать и что делать.

До этого никогда ни с какими графическими библиотеками не работал(ни с DirectX, ни с OpenGL), поэтому даже представить себе не могу как это работает

Mixim
() автор топика
Ответ на: комментарий от Bad_ptr

Спасибо за ответ, но нельзя ли было немного по-подробнее? Судя по тому, что написано по первой ссылке:

WHAT IS MONOGAME

MonoGame is an OpenSource, OpenGL implementation of Microsoft's XNA 4 APIs that allows developers to build games that run on Android, iPhone, iPad, MacOS, Linux and soon PlayStation Suite and Windows Metro, all reusing their existing XNA code that runs on Xbox 360 or Windows Phone 7.

т.е.

Что такое MonoGame

MonoGame является проектом с открытым исходным кодом, OpenGL реализацией Microsoft's XNA 4 API, которая позволяет разработчикам создавать игры, которые запускаются на Android, iPhone, iPad, MacOS, Linux, а также на PlayStation Suite и Windows Metro, позволяет повторно использовать существующий код XNA, который работает на Xbox 360 или Windows Phone 7.

Однако, в моем случае нет необходимости реализовывать какую-либо игру, все гораздо проще(текстурирование 3D-объектов), так что указанный проект практически не помог.

Насчет второго линка: может быть это и то что нужно, но нельзя ли было попросить у Вас внести небольшие комментарии: что можно почитать, где, помимо официального сайта, можно найти примеры?

Mixim
() автор топика
Ответ на: комментарий от Mixim

Однако, в моем случае нет необходимости реализовывать какую-либо игру

никто не заставляет.

Насчет второго линка

почитать тут http://www.opentk.com/doc/graphics
Простейший пример, что-то типа:

using OpenTK;
using OpenTK.Graphics;
//using OpenTK.Graphics.OpenGL;

namespace TestOpenTk
{
  public class Program : GameWindow
  {

    public Program () : base( 1424, 800, new GraphicsMode(16,16) )
    {}

    protected override void OnLoad (EventArgs e)
    {
      base.OnLoad (e);

      GL.ClearColor (Color.MidnightBlue);
      GL.Enable (EnableCap.DepthTest);

      GL.Ortho (0, 1424, 0, 800, -1.0, 1.0);
    }

    protected override void OnResize (EventArgs e)
    {
      base.OnResize (e);

      GL.Viewport (0, 0, Width, Height);
    }


    protected override void OnUpdateFrame (FrameEventArgs e)
    {
      base.OnUpdateFrame (e);

      if (Keyboard [OpenTK.Input.Key.Escape]) {
        this.Exit ();
        return;
      }

    }

    public void DrawCircle( float x, float y, float r )
    {
      float alp, k = 360/10;
      GL.Begin(BeginMode.LineStrip);
      for(int i = 0; i <= 10; i++){
        alp = k*i * (float)Math.PI / 180.0f;
        GL.Vertex3( r * Math.Cos(alp) + x, r * (float)Math.Sin(alp) + y, 0);
      }
      GL.End();
    }

    protected override void OnRenderFrame (FrameEventArgs e)
    {
      base.OnRenderFrame (e);

      GL.Clear (ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);

      DrawCircle ( 50, 50, 50 );

      this.SwapBuffers ();
    }

    [STAThread]
    public static void Main ()
    {
      using (Program prog = new Program()) {
        prog.Run( 30.0, 0.0 );
      }
    }
  }
}

Bad_ptr ★★★★★
()
Последнее исправление: Bad_ptr (всего исправлений: 1)
Ответ на: комментарий от Mixim

Как понимаю, подцепленая к проекту DLL обращается к графической библиотеке, точнее сказать, к файлу графической библиотеки «freeglut.dll», который не установлен

видимо ваша библиотеке - обертка на glut, а не над opengl.

 GLUT is a window system independent toolkit for writing OpenGL programs,
 implementing a simple windowing API, which makes learning about and exploring
 OpenGL programming very easy. 
 
 GLUT is designed for constructing small to medium sized OpenGL programs,
 however it is not a full-featured toolkit, so large applications requiring
 sophisticated user interfaces are better off using native window system
 toolkits like GTK+ or Motif.
Сайт: http://freeglut.sourceforge.net/
видимо вам надо поставить freeglut

maloi ★★★★★
()

А мне такая штука больше понравилась для OpenGL под C#: http://www.opentk.com

По крайней мере демки себя достойно показали в плане запускабельности и работоспособности, слышал что оно напрямую дергает нативные либы OpenGL и поэтому не требует поставки нативных либ вообще - запускай хоть на ARM.

А последний апдейт - 7 месяцев назад. Не такое замшелое как Tao (раз ты говоришь 7 лет назад)...

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от vertexua

Благодарю, уже разобрался с этим. Всем огромное спасибо за помощь

Mixim
() автор топика
Ответ на: комментарий от I-Love-Microsoft

Её и использую, только в результате работы возникает полное не понимание. Использую стандартный код из примеров OpenTK, накладываю текстуру на объект (в силу того, что пока разбераюсь, это просто прямоугольник), но текстура накладывается перевернутой на 180 градусов.

Кто-нибудь может подсказать в чем может быть дело? Почитав дополнительные данные по OpenGL/OpenTK выяснил, что если в C# координаты начинаются с левого верхнего угла, то OpenGL в качестве начала координат применяет левый нижний угол (вот в этом то и зарыта собака). Как тогда правильно подгружать текстуры, чтобы они нормально накладывались (в настоящий момент просто «переворачиваю» отображаемую фигуру, но это не есть хорошо)?

Mixim
() автор топика

Советую сначала почитать вот это:
http://www.arcsynthesis.org/gltut/

По сути основная часть движка - это код на шейдерном языке, а не на обычном. OpenGL - низкоуровневый инструмент, готорый нужно уметь готовить.

Если же свой движек нафиг не нужен, то смотри в сторону SceneGraph фреймворков, а не OpenGL обёрток.

snizovtsev ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.