Russian Qt Forum

Qt => Общие вопросы => Тема начата: 8Observer8 от Август 04, 2014, 08:40



Название: [Решено] Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 04, 2014, 08:40
Привет!

Судя по этой цитате из книги "OpenGL. Супер книга" "трёхмерная графика стала типичной составляющей пользовательских и коммерческих приложений, а не только игр и научных приложений":
Цитировать
OpenGL используется для решения множества задач, возникающих в различных сферах - от архитектурных и инженерных приложений до программ моделирования, используемых для создания компьютерных монстров в фильмах со спецэффектами. Введение трехмерного программного интерфейса приложений, являющегося промышленным стандартом, в такие операционные системы, как Microsoft Windows и Macintosh OS X, имело впечатляющие последствия С распространением аппаратного ускорения и быстродействующих микропроцессоров для персональных компьютеров трёхмерная графика стала типичной составляющей пользовательских и коммерческих приложений, а не только игр и научных приложений, как было раньше.

В связи с этим у меня возникло желание использовать его во всех своих приложениях (или в большинстве из них). Но есть трудности в том, как наиболее эффективно осваивать OpenGL. Покажите, пожалуйста, этот путь с самого начала. Как ребёнок бы начал его осваивать? :)

Заранее спасибо за ответы!


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: gil9red от Август 04, 2014, 09:14
Самый простой и верный способ?
Просто делайте что-нибудь с OpenGL, как можно чаще, тогда и научитесь. Других путей не бывает.
 :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 04, 2014, 09:19
Да, тоже вариант :)

Надеюсь, ссылки накидуют, кто уже освоил.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 04, 2014, 11:02
Я изучаю сейчас OpenGL по этой же книге.
Её пока вполне достаточно. Примеров там тоже хватает.
Были небольшие сложности с подсоединением glut и запуском GLTools (которые идут с книгой). Но всё это удалось победить.
У Шлее есть простой пример, что нужно переопределять в классе QGLWidget.
Ну, и справка с google тоже пригодились для создания двойного буфера и т.п.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 04, 2014, 11:33
Вот такой ещё есть пример: http://www.gamedev.ru/code/articles/OpenGL_Qt4

Примеры из Шлее я разобрал.

Научился загружать кубик из 3D-редактора Blender: http://www.prog.org.ru/index.php?topic=26752.msg194255#msg194255

Физический движок Bullet смог подключить к Qt Creator'у: http://www.prog.org.ru/index.php?topic=26838.msg194636#msg194636

Для меня NeHe и СуперКнига - очень сложные.

Эту тему я перенёс вот сюда: http://www.gamedev.ru/code/forum/?id=191780

В результате обсуждения я решил, что начинать надо с DirectX 11 и C#. А потом постепенно внедрять OpenGL в Qt и Java.

Разработчику нужно расширять кругозор (но при этом не распыляться), чтобы для конкретной задачи выбирать подходящие инструменты!


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 04, 2014, 12:02
Вот вам примеры 2 и 3 главы из суперкниги (см. аттач), которые я при изучении адаптировал под Qt.
Сама книга не сложная (NeHe, на сколько помню, тоже не особо). Сложной математики в ней нет.
Какой момент вам из суперкниги непонятен?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 04, 2014, 13:39
Есть несколько непоняток вначале. Потом напишу. За примеры спасибо! Ещё не смотрел.

Какое у вас издание? У меня 3-е, на русском. Говорят, что надо читать последнее на английском, потому что оно проще и там новая версия OpenGL

--- Update ---

Во-втором примере ошибка:
Цитировать
D:\Qt\QtOpenGL\_Downloaded\OpenGL_training\chapter2\bounce.cpp:12: error: no matching function for call to 'QString::arg()'
     setWindowTitle(QString("Bounce (build %1)").arg(BUILD));
                                                          ^

--- Update ---

Строку закомментил, пример интересный. Почитаю код. Потом отпишусь :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 04, 2014, 14:01
Да, извиняюсь. Пробовал некоторые штучки во второй главе. Ошибки просто нужно закомментить.
Книга у меня 2006г. на русском. Мне проще изучать на русском, чтобы понять концепцию. Естественно, на этой книге я не остановлюсь  ;)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 04, 2014, 16:14
Лекция 1: http://www.gamedev.ru/code/articles/OpenGL_Qt4
Код (Qt5): https://github.com/8Observer8/Icosahedron

Лекция 2: http://www.gamedev.ru/code/articles/OpenGL_Qt4_part2
Код (Qt5): https://github.com/8Observer8/Animation

Книга "SuperBible", самое свежее шестое издание: http://rutracker.org/forum/viewtopic.php?t=4553108
Код к книге: http://www.openglsuperbible.com/

P.S. Один только способ научиться - руками весь код набирать, до полного автоматизма (выпрямления) :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 04, 2014, 16:28
Один только способ научиться - руками весь код набирать, до полного автоматизма (выпрямления) :)

Куда ж без этого. Так просто не запомнишь  :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 06, 2014, 08:18
Почитал я начало шестого издания суперкниги.
Так понимаю, что там рассматривается работа с GLSL, что, как я понимаю, в нынешнее время ценится больше, чем голый OpenGL.
В книге 2006 года используются именно OpenGL как есть. Мне стартовать с неё было проще. Там информация на привычном русском и достаточно всё разжевано. Очень просто понять аспекты рисования. Там функции вызываются напрямую, без компиляции, компоновки и дополнительного изучения языка шейдеров, что, на мой взгляд, удобнее для восприятия. Конечно же, наверное, на практике лучше будет использовать именно GLSL.

Могу ошибаться.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 06:39
__Heaven__, в 3-ем издании тоже GLSL есть (если не ошибаюсь) ближе к концу книги. Там про шейдеры было написано.

Хочу большой шаг сделать. А именно, освоить хождение по 3D миру. Просто плоскость без текстуры и плавное перемещение камеры вдоль плоскости (с поворотами и возможностью посмотреть вниз и вверх). Вот такой пример есть, но он очень древний: http://pmg.org.ru/nehe/nehe10.htm __Heaven__, какие у вас мысли по этому поводу?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 07, 2014, 07:52
На этот счет в суперкниге 3изд имеется хороший пример sphereworld, который начинается с 4 главы и наращивается до конца книги


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 08:13
Спасибо! Наверняка он и в 6-й есть :)

Я сейчас хочу запустить самый первый пример из 6-й суперкниги. Он на шейдерах. Попробую из книги его набрать. А вот среди файлов с книжными примерами я так и не смог найти его, так как в книге названий примеров нет. А в папках примеры не по главам.

--- Updata ---

Я разобрался. Примеры к книге можно открыть, как "Solution" к Visual C++ 2010 Express Edition. Только для каждого проекта надо открыть "Properties" и в разделе "Linker"->"General" выставить "Enable Incremental Linking" в значение "No (/INCREMENTAL:NO)"

Вот только проблемка есть, что программа быстро завершается и я не могу посмотреть результат. Enty point там: DECLARE_MAIN(alienrain_app)

Как сделать паузу в Visual C++ 2010? Понимаю, что это не касается Qt, но может кто знает. Я на Qt переделаю.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 07, 2014, 08:58
Ххы. Сделайте там бесконечный цикл типа QEventLoop.

PS а в VS2010 (Visual STUDIO) можно поставить брейкпоинт и это будет пауза выполнения программы.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 09:01
А на какой строчке его поставить?

Код
C++ (Qt)
/*
* Copyright © 2012-2013 Graham Sellers
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/

 
#include <sb6.h>
#include <sb6ktx.h>
#include <vmath.h>
 
#include <cmath>
 
// Random number generator
static unsigned int seed = 0x13371337;
 
static inline float random_float()
{
   float res;
   unsigned int tmp;
 
   seed *= 16807;
 
   tmp = seed ^ (seed >> 4) ^ (seed << 15);
 
   *((unsigned int *) &res) = (tmp >> 9) | 0x3F800000;
 
   return (res - 1.0f);
}
 
class alienrain_app : public sb6::application
{
   void init()
   {
       static const char title[] = "OpenGL SuperBible - Alien Rain";
 
       sb6::application::init();
 
       memcpy(info.title, title, sizeof(title));
   }
 
   void startup()
   {
       GLuint  vs, fs;
 
       static const char * vs_source[] =
       {
           "#version 410 core                                                      \n"
           "                                                                       \n"
           "layout (location = 0) in int alien_index;                              \n"
           "                                                                       \n"
           "out VS_OUT                                                             \n"
           "{                                                                      \n"
           "    flat int alien;                                                    \n"
           "    vec2 tc;                                                           \n"
           "} vs_out;                                                              \n"
           "                                                                       \n"
           "struct droplet_t                                                       \n"
           "{                                                                      \n"
           "    float x_offset;                                                    \n"
           "    float y_offset;                                                    \n"
           "    float orientation;                                                 \n"
           "    float unused;                                                      \n"
           "};                                                                     \n"
           "                                                                       \n"
           "layout (std140) uniform droplets                                       \n"
           "{                                                                      \n"
           "    droplet_t droplet[256];                                            \n"
           "};                                                                     \n"
           "                                                                       \n"
           "void main(void)                                                        \n"
           "{                                                                      \n"
           "    const vec2[4] position = vec2[4](vec2(-0.5, -0.5),                 \n"
           "                                     vec2( 0.5, -0.5),                 \n"
           "                                     vec2(-0.5,  0.5),                 \n"
           "                                     vec2( 0.5,  0.5));                \n"
           "    vs_out.tc = position[gl_VertexID].xy + vec2(0.5);                  \n"
           "    float co = cos(droplet[alien_index].orientation);                  \n"
           "    float so = sin(droplet[alien_index].orientation);                  \n"
           "    mat2 rot = mat2(vec2(co, so),                                      \n"
           "                    vec2(-so, co));                                    \n"
           "    vec2 pos = 0.25 * rot * position[gl_VertexID];                     \n"
           "    gl_Position = vec4(pos.x + droplet[alien_index].x_offset,          \n"
           "                       pos.y + droplet[alien_index].y_offset,          \n"
           "                       0.5, 1.0);                                      \n"
           "    vs_out.alien = alien_index % 64;                                   \n"
           "}                                                                      \n"
       };
 
       static const char * fs_source[] =
       {
           "#version 410 core                                                      \n"
           "                                                                       \n"
           "layout (location = 0) out vec4 color;                                  \n"
           "                                                                       \n"
           "in VS_OUT                                                              \n"
           "{                                                                      \n"
           "    flat int alien;                                                    \n"
           "    vec2 tc;                                                           \n"
           "} fs_in;                                                               \n"
           "                                                                       \n"
           "uniform sampler2DArray tex_aliens;                                     \n"
           "                                                                       \n"
           "void main(void)                                                        \n"
           "{                                                                      \n"
           "    color = texture(tex_aliens, vec3(fs_in.tc, float(fs_in.alien)));   \n"
           "}                                                                      \n"
       };
 
       char buffer[1024];
 
       vs = glCreateShader(GL_VERTEX_SHADER);
       glShaderSource(vs, 1, vs_source, NULL);
       glCompileShader(vs);
 
       glGetShaderInfoLog(vs, 1024, NULL, buffer);
 
       fs = glCreateShader(GL_FRAGMENT_SHADER);
       glShaderSource(fs, 1, fs_source, NULL);
       glCompileShader(fs);
 
       glGetShaderInfoLog(vs, 1024, NULL, buffer);
 
       render_prog = glCreateProgram();
       glAttachShader(render_prog, vs);
       glAttachShader(render_prog, fs);
       glLinkProgram(render_prog);
 
       glDeleteShader(vs);
       glDeleteShader(fs);
 
       glGenVertexArrays(1, &render_vao);
       glBindVertexArray(render_vao);
 
       tex_alien_array = sb6::ktx::file::load("media/textures/aliens.ktx");
       glBindTexture(GL_TEXTURE_2D_ARRAY, tex_alien_array);
       glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
 
       glGenBuffers(1, &rain_buffer);
       glBindBuffer(GL_UNIFORM_BUFFER, rain_buffer);
       glBufferData(GL_UNIFORM_BUFFER, 256 * sizeof(vmath::vec4), NULL, GL_DYNAMIC_DRAW);
 
       for (int i = 0; i < 256; i++)
       {
           droplet_x_offset[i] = random_float() * 2.0f - 1.0f;
           droplet_rot_speed[i] = (random_float() + 0.5f) * ((i & 1) ? -3.0f : 3.0f);
           droplet_fall_speed[i] = random_float() + 0.2f;
       }
 
       glBindVertexArray(render_vao);
       glEnable(GL_BLEND);
       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
   }
 
   void render(double currentTime)
   {
       static const GLfloat black[] = { 0.0f, 0.0f, 0.0f, 0.0f };
       float t = (float)currentTime;
 
       glViewport(0, 0, info.windowWidth, info.windowHeight);
       glClearBufferfv(GL_COLOR, 0, black);
 
       glUseProgram(render_prog);
 
       glBindBufferBase(GL_UNIFORM_BUFFER, 0, rain_buffer);
       vmath::vec4 * droplet = (vmath::vec4 *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, 256 * sizeof(vmath::vec4), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT);
 
       for (int i = 0; i < 256; i++)
       {
           droplet[i][0] = droplet_x_offset[i];
           droplet[i][1] = 2.0f - fmodf((t + float(i)) * droplet_fall_speed[i], 4.31f);
           droplet[i][2] = t * droplet_rot_speed[i];
           droplet[i][3] = 0.0f;
       }
       glUnmapBuffer(GL_UNIFORM_BUFFER);
 
       int alien_index;
       for (alien_index = 0; alien_index < 256; alien_index++)
       {
           glVertexAttribI1i(0, alien_index);
           glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
       }
   }
 
protected:
   GLuint          render_prog;
   GLuint          render_vao;
 
   GLuint          tex_alien_array;
   GLuint          rain_buffer;
 
   float           droplet_x_offset[256];
   float           droplet_rot_speed[256];
   float           droplet_fall_speed[256];
};
 
DECLARE_MAIN(alienrain_app)
 
 


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 09:21
__Heaven__, как вы думаете, примеры из "SuperBible" 6 изд. возможно будет на Qt переделать? Я смотрю там какие-то свои библиотеки и все они "lib"


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Igors от Август 07, 2014, 09:22
Как сделать паузу в Visual C++ 2010?
Property - Linker - System, значение SubSystem = Console, тогда имеете стандартный ввод-вывод


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 09:33
Igors, не катит:
Цитировать
1>------ Build started: Project: alienrain, Configuration: Debug Win32 ------
1>alienrain.obj : warning LNK4075: ignoring '/EDITANDCONTINUE' due to '/INCREMENTAL:NO' specification
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
1>D:\_books_reading_now\OpenGL\Richard S.W. Nicholas H. Graham S. - OpenGL SuperBible (6th Edition) - 2013\sb6code_2013_11_10\bin\alienrain_dbg.exe : fatal error LNK1120: 1 unresolved externals
========== Build: 0 succeeded, 1 failed, 1 up-to-date, 0 skipped ==========

Эх, под Qt будет сложно переписать. Как видите, выше в примере подключается файл sb6.h, а к нему в паре идёт библиотека ".lib". А у меня MinGW версия Qt. Хочу эти примеры дорабатывать и развивать в Qt


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 09:44
Для начала надо добиться, чтобы она хотя бы в Visual C++ нормально работата. Я открыл файл sb6.h и поставил точку останова. Программу выполнял пошагам и обнаружил, что она завершается здесь:

Код
C++ (Qt)
           if (!glfwOpenWindow(info.windowWidth, info.windowHeight, 8, 8, 8, 0, 32, 0, GLFW_WINDOW))
           {
               fprintf(stderr, "Failed to open window\n");
               return;
           }
 


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 09:55
Получается, что функция glfwOpenWindow завершается ошибкой. Что теперь делать? Как это исправлять?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 07, 2014, 11:40
С 6 изданием я пока что поработать не успел.
В 3 издании тоже предлагается использование изобретение автора GLTools.h. Форма создается там с помощью библиотеки glut. Переписывая примеры я не стал использовать функции glut, аналоги которых я нашёл в Qt. Это функции инициализации, изменения размера окна, перерисовки, таймера. GLTools я использовал. Но от него можно и отказаться просто переписав в свой проект необходимые функции.
Я считаю, что с долей вероятности 99% можно переделать все примеры из 6 издания под qt. По сути, основное, что используется в примерах, это OpenGL 4.3


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 12:00
__Heaven__, в 6-м издании абсолютно все примеры на GLSL, С++ и WinAPI. Причём C++ используется никак процедурный, а как ООП :)

Я застрял на том, что функция glfwOpenWindow во всех примерах возвращает false. Не могу понять в чём дело: https://www.opengl.org/discussion_boards/showthread.php/176821-glfwOpenWindow


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 12:33
В примерах 6-ого издания используется библиотека GLFW: http://www.glfw.org/

Но эта функция возвращает false:
Код
C++ (Qt)
if (!glfwOpenWindow(info.windowWidth, info.windowHeight, 8, 8, 8, 0, 32, 0, GLFW_WINDOW))
{
   fprintf(stderr, "Failed to open window\n");
   return;
}
 

Как узнать почему?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 12:51
Кстати, оказывается GLFW мне не нужен. Так как этот фреймворк используется для создания GUI. Зачем мне GUI на GLFW если есть Qt :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 07, 2014, 13:01
Кстати, оказывается GLFW мне не нужен. Так как этот фреймворк используется для создания GUI. Зачем мне GUI на GLFW если есть Qt :)
Именно это я Вам и пытался донести.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 07, 2014, 14:38
__Heaven__, спасибо! Я что-то не догадался :)

Оказывается в Qt5.3.0 версия OpenGL 3.0.0. Если я правильно понимаю, что именно Qt ограничивает версию, а не драйвер установленный для моей видео карты. Подскажите, пожалуйста, какая версия OpenGL идёт с Qt5.3.1. Просто создайте пустой проект и запустите код (не забудьте добавить в pro-файл: QT += opengl)

Код
C++ (Qt)
 
#include <QGLFormat>
#include <QGLWidget>
#include <QString>
#include <QDebug>
#include <QApplication>
 
int main( int argc, char *argv[] )
{
   QApplication app( argc, argv );
 
   QGLFormat format;
   format.setVersion( 4, 3 );
   QGLFormat::setDefaultFormat( format );
 
   QGLWidget w;
   w.makeCurrent();
 
   QString versionString1(QLatin1String(reinterpret_cast<const char*>(glGetString(GL_VERSION))));
   qDebug() << "Driver Version String:" << versionString1;
 
   return app.exec();
}
 


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 08, 2014, 08:31
Я сегодня столкнулся с проблемой.
Захотелось мне запустить свое приложение под android. В итоге на этапе компиляции вылетела ошибка о том, что не известно, кто такие glMatrixMode, glOrtho и т.д.
Кто знает, имеет ли смысл изучать обычные функции openGL или рваться за GLSL, если речь идёт об Android?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: navrocky от Август 08, 2014, 08:47
Я сегодня столкнулся с проблемой.
Захотелось мне запустить свое приложение под android. В итоге на этапе компиляции вылетела ошибка о том, что не известно, кто такие glMatrixMode, glOrtho и т.д.
Кто знает, имеет ли смысл изучать обычные функции openGL или рваться за GLSL, если речь идёт об Android?

В этом случае, я думаю, надо изучать OpenGL ES >=2.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 08, 2014, 09:38
__Heaven__, как я понимаю, вы скачали, что-то типа: "Qt 5.3.1 for Android (Windows 32-bit, 814 MB)" Есть ли там эмулятор для Android?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: navrocky от Август 08, 2014, 10:15
__Heaven__, спасибо! Я что-то не догадался :)

Оказывается в Qt5.3.0 версия OpenGL 3.0.0. Если я правильно понимаю, что именно Qt ограничивает версию, а не драйвер установленный для моей видео карты. Подскажите, пожалуйста, какая версия OpenGL идёт с Qt5.3.1. Просто создайте пустой проект и запустите код (не забудьте добавить в pro-файл: QT += opengl)

 :o

Qt не идет с OpenGl, он от неё зависит, причем, от OpenGL зависит только QtQuick2, ему необходима версия >=2.0. У QtOpenGL нет каких-либо высоких требований к минимальной версии OpenGL (GLX >= 1.3)

А все эксперименты с получением версии OpenGL из приложения смысла не имеют, получишь лишь версию OpenGL пришедшую с драйвером текущей видеокарты.
Сейчас для NVidia OpenGL 4.0, для остальных не знаю, но не меньше 3.0. Если драйвер не установлен, то с виндой идет заглушка версии 1.2.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 08, 2014, 10:58
__Heaven__, как я понимаю, вы скачали, что-то типа: "Qt 5.3.1 for Android (Windows 32-bit, 814 MB)" Есть ли там эмулятор для Android?
Нет. Версия Qt, которую я использую, запускается из-под ubuntu.
Установку проводил из online инсталлятора. При выборе компонентов выделил всё (целью было запустить android приложение).

Далее установка android sdk и ndk... Здесь-то и присутствует эмулятор. Но, как я понял, лучше запускаться на реальном устройстве. QML изучить ешё не успел, поэтому widget app использую. Проекты, конечно, весят прилично (30 мб "hello world"). И очень забавляет диалог открытия файла - вырисовывается как под Linux.

Конечно, открытие с opengl es меня не обрадовало...

Быть может здесь подскажут, как можно использовать ES 1.x вместо ES 2? Я так понял, что там имеются интересующие меня фунцкии


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 08, 2014, 13:01
__Heaven__, спасибо! Я что-то не догадался :)

Оказывается в Qt5.3.0 версия OpenGL 3.0.0. Если я правильно понимаю, что именно Qt ограничивает версию, а не драйвер установленный для моей видео карты. Подскажите, пожалуйста, какая версия OpenGL идёт с Qt5.3.1. Просто создайте пустой проект и запустите код (не забудьте добавить в pro-файл: QT += opengl)

Код
C++ (Qt)
...
 
У меня выдаёт Driver Version String: "4.3.0"


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 08, 2014, 13:04
Под ubuntu на нетбуке Driver Version String: 3.3 (Core Profile) Mesa 10.1.3
Не от карты ли зависит?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 08, 2014, 13:11
От карты, видимо, зависит потолок, потому что я обновил дрова и теперь вместо 4.1.0 - вижу 4.3.0:
Цитировать
Vendor: NVIDIA Corporation
Renderer: GeForce GT 540M/PCIe/SSE2
Version: 4.3.0
GLSL: 4.30 NVIDIA via Cg compiler

Обновил драйвера для своего Asus X53S отсюда: http://www.nvidia.ru/download/driverResults.aspx/77333/ru


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 08, 2014, 15:54
Теперь примеры запускаются :)

Инструкция по запуску примеров из SuperBible 6-ого издания в среде Visual C++ 2010 Express Edition и на ноутбуке Asus X53S

Инструментарий:
- Ноутбук Asus X53S
- Видеокарта GeForce GT 540M CUBE 1GB
- ОС Win7
- IDE Visual C++ 2010 Express Edition

Инструкция:
- скачиваем и устанавливаем драйвера: http://www.nvidia.ru/download/driverResults.aspx/77333/ru
- скачиваем примеры: http://www.openglsuperbible.com/
- открываем "sb6.sln" в Visual C++ 2010
- кликаем правой кнопкой по какому-нибудь примеру -> выбираем "Properties"
- выбираем "Linker" -> "General" -> меняем значение поля "Enable Incremental Linking" = "No (/INCREMENTAL:NO)" -> нажимаем OK
- кликаем правой кнопкой по примеру -> выбираем "Build"
- переходим в папку, где лежит exe-файл примера
- кликаем правой кнопкой по exe-файлу и выбираем: "Run with graphics processor" -> "Change default graphics processor"
- в открывшимся окне выбираем exe-файл примера и "High-performance NVIDIA processor", как показано на рисунке ниже и нажимаем "Apply":

(http://i6.pixs.ru/storage/7/8/4/267png_8284909_13325784.png)

- переходим в Visual и нажимаем кнопку "Run"


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 12, 2014, 21:49
Я до сих пор не смог переписать программу SinglePoint на Qt. Изучение GLSL заглохло.
Быть может у кого-нибудь есть эта реализация под Qt?


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 08:02
__Heaven__, вы примеры из Qt SDK все изучили? Мне попадались с GLSL. Как SinglePoint напишите - покажите код

Кодом обмениваться лучше через Git. Установите Git. Я обычно в Far'е захожу в папку с проектом и нажимаю Ctrl+F4, пишу .gitignore Потом в файле .gitignore пишу:
Цитировать
*build
*.pro.user
- Далее F2 (сохранить), F10 (закрыть файл)
- Тут создаёте проект: https://github.com/
- Возвращаетесь в Far, нажимаете Ctrl+O (показать консоль) и последовательно вводите команды:
Код:
git init
git add .gitignore
git add .
git commit -am "First Commit"
git git push https://github.com/8Observer8/Qt_ContentFromVkCom.git refs/heads/master:refs/heads/master
В последней команде у вас имя перед .git будет другое. Далее надо будет ввести username и password от github А ссылку на код сюда. Так кодом легче обмениваться будет.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 13, 2014, 08:17
Да, изучал примеры. Есть хороший hellogl_es. Правда, он нагромождён. Видимо, его придётся разгребать, чтобы понять.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 08:22
Жду от вас SinglePoint :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Figaro от Август 13, 2014, 10:29
Может All подскажет... как от этого ТС (дебила) избавиться в unread... Даже смеяться, кажется, смешно...


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 10:40
Ну не надо грубить. Я вот с интересом его почитываю. Хотя все почти на него забили :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 13, 2014, 11:02
Объясните, пожалуйста, непосвященному, о чём идет речь.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 11:25
Он пишет о Theme Creator, если по русски - авторе данной темы. Он обзывает его ... . Почему? Потому что ранее каждый день, а теперь каждую неделю ТС начинает изучать новую тему не закончив старую. Как с редькой - вершки съем, а корешки пусть гниют :)

Потому он его читать уже не может и не хочет видеть эти темы.

PS а мне интересно :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Igors от Август 13, 2014, 11:57
Может All подскажет... как от этого ТС (дебила) избавиться в unread... Даже смеяться, кажется, смешно...
Да, откровенная беготня и хватание по верхам раздражает - но это не дает Вам права оскорблять (и напрасно модератор это спускает)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 13, 2014, 12:26
Bepec, спасибо.

Ну, может человек ищет себя. В этом нет ничего презрительного. Когда перед тобой лежит много вкусностей, естественно, хочется попробовать каждую  :P :) .


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 14:24
Может All подскажет... как от этого ТС (дебила) избавиться в unread... Даже смеяться, кажется, смешно...
Очень просто. Вам по почте приходят ответы в теме, чтобы отписаться достаточно в письме нажать ссылку:
Цитировать
Чтобы отказаться от уведомления из темы, нажмите сюда: http://www.prog.org.ru/index.php?action=notify;topic=27410.0

Если вы об этом знаете, то почему вы до сих пор записаны? И впредь прошу не подписываться и не заходить на мои темы, если они вас так раздражают.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 14:27
Мдаа.... тут я просто в шоке.

8Observer8 - на e-mail приходят только подписавшимся.
А Figaro специально для вас уточнил - в unread. Т.е. "Показать новые сообщения с вашего последнего визита".
Отписаться от этого я пока никакой возможности не вижу.

PS вот именно про это я и говорил - человек не читает сообщения и сразу пишет ответ :D Не думая :D


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 14:39
Понял, что такое unread. Просто у меня в закладках ссылка на главную страницу:
(http://i7.pixs.ru/storage/9/1/4/274png_4378137_13392914.png)

Цитировать
Отписаться от этого я пока никакой возможности не вижу.
А то что он на эту тему подписан это нормально? Я про то говорю, чтобы он отписался.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 14:54
То, что он подписан придумал ты сам :) Почитай ради разнообразия сообщения :D


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 15:08
То, что он подписан придумал ты сам :) Почитай ради разнообразия сообщения :D
А это что?
(http://i7.pixs.ru/storage/3/8/7/275png_7089851_13393387.png)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 15:36
Ахз :) Оно у всех стоит. Но мой e-mail тревожат только ЛС :)

PS отписаться то кнопки нет :D


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 15:48
Ахз :) Оно у всех стоит. Но мой e-mail тревожат только ЛС :)
Может в настройках поставить надо. А то что нет "unread", "игнорить" или что-то типа "чёрного списка" - это недоработки

PS отписаться то кнопки нет :D
Есть
(http://i6.pixs.ru/storage/8/0/4/276png_1981817_13393804.png)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 16:07
Человек, подумай головой. Именно головой. Уведомлять - это получать уведомление на e-mail при новых сообщениях в теме. А мы говорим об UnRead :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 16:23
Я говорил про то, что человек "Записан" на эту тему и это странно. Надеюсь, он теперь знает, как отписаться. А с предложением добавить "UnRead" пусть обращается к тем, кто может добавить такую функцию на форум.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Bepec от Август 13, 2014, 16:31
Ухуху. Надпись "записан" при некотором рассмотрении означает, что ip с которого сообщение было отправлено записан и может быть доступен для просмотра модератором :)

PS печальное отсутствие логики в рассуждениях.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 16:36
Теперь буду знать! Спасибо :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 17:35
И я помню только одну незаконченную тему - это карточная игра "Дурак". Сейчас пишу парсеры сайтов на регулярках, Qt, PHP, JavaScript (jQuery), вкупе с базами данных: MySQL для PHP, и SQLite для Qt. Как обрабатывать ошибки с помощью своих классов исключений - я научился (и на PHP с JavaScript тоже). Писать тесты с помощью Google Test по методологии TDD - тоже научился (для PHP использую PHPUnit, а для JavaScript - QUnit) О том "зачем нужны тесты", вот здесь человек хорошо написал:
- http://programmersforum.ru/showpost.php?p=1385278&postcount=190
- http://programmersforum.ru/showpost.php?p=1395490&postcount=200

То чему я научился я применяю на практике каждый день, а времени на продолжение некоторых учебных тем - нет. Я имею ввиду, к примеру "Контейнерные классы" или "Этапы разработки ПО. Научите, как работает профессионал."

А OpenGL - это очень интересно и в ближайшие несколько лет это просто хобби :)

P.S. Всем большое спасибо! Отдельное спасибо Igors, который вдохновил на контроль ошибок и не писать всё в main :) Old много помог. И много ребят, которые помогали по предельно конкретным вопросам очень быстро и качественно



Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 17:36
Тут все мои темы. Укажите, пожалуйста, какие назаконченны:

Контейнерные классы
http://www.prog.org.ru/topic_26470_0.html

Программа для разминки и зарядки для глаз
http://www.prog.org.ru/topic_26515_0.html

Разработка ПО на Qt через тестирование (Test-Driven Development)
http://www.prog.org.ru/topic_26527_0.html

Ошибка с QSslSocket. Работа с сервером vk.com. Работа с xml. Улучшение архитекты
http://www.prog.org.ru/topic_26547_0.html

Вывод русских символов в консоль
http://www.prog.org.ru/topic_26545_0.html

Причины утечки памяти и способы борьбы с ними
http://www.prog.org.ru/topic_26531_0.html

Тренировка навыков быстрого программирования
http://www.prog.org.ru/topic_26534_0.html

Как писать ООП программы?
http://www.prog.org.ru/topic_26549_0.html

Возникновение тупиковых ситуаций (многопоточность)
http://www.prog.org.ru/topic_26466_0.html

Конечный результат разработки ПО на Qt
http://www.prog.org.ru/topic_26556_0.html

Пошаговая инструкция. Создание и использование Dll
http://www.prog.org.ru/topic_26558_0.html

Пошаговая инструкция по Git. Сохранение файлов проекта на удалённый сервер
http://www.prog.org.ru/topic_26393_0.html

Инструкция для сборки приложений на Qt в один exe без зависимостей
http://www.prog.org.ru/topic_26392_0.html

Пошаговая инструкция. Разработка ПО на Qt C++ по методике TDD
http://www.prog.org.ru/topic_26413_0.html

Возможно ли написать клиент на Qt для Java-сервера?
http://www.prog.org.ru/topic_26561_0.html

Графическое отображение данных на Qt
http://www.prog.org.ru/topic_26675_0.html

Система сбора и отображения данных
http://www.prog.org.ru/topic_26625_0.html

Преобразование из QString в qint64
http://www.prog.org.ru/topic_26669_0.html

Модуль QTest. Работа с исключениями.
http://www.prog.org.ru/topic_26797_0.html

Google Mock & Qt
http://www.prog.org.ru/topic_26807_0.html

Тестирование закрытых и защищённых методов (QTest)
http://www.prog.org.ru/topic_26811_0.html

Выбор протокола для работы через последовательный порт
http://www.prog.org.ru/topic_26765_0.html

Обработка ошибок без исключений и с помощью исключений
http://www.prog.org.ru/topic_26723_0.html

Приложение Hello, World! для Bullet в Qt
http://www.prog.org.ru/topic_26838_0.html

Зарубежный сертификат инженера-программиста на Qt
http://www.prog.org.ru/topic_26851_0.html

Вывод графика на диалоговое окно
http://www.prog.org.ru/index.php?topic=26874

Как составлять техническое задание?
http://www.prog.org.ru/topic_26879_0.html

Этапы разработки ПО. Научите, как работает профессионал.
http://www.prog.org.ru/topic_26881_0.html

Модуль QTest. Работа с исключениями.
http://www.prog.org.ru/topic_26797_0.html

Google Mock & Qt
http://www.prog.org.ru/topic_26807_0.html

Как правильно подсоединить к проекту внешние загаловочные файлы?
http://www.prog.org.ru/topic_26791_0.html

Создание массива вершин фигуры с помощью редактора
http://www.prog.org.ru/topic_26752_0.html

Паттерны проектирования для проектов на Qt
http://www.prog.org.ru/topic_26920_0.html

Статическая сборка Qt 5.1.1 на Windows 7
http://www.prog.org.ru/topic_26164_0.html

Зачем в данном коде виртуальный диструктор и throw()?
http://www.prog.org.ru/topic_27041_0.html

Ввод\вывод данных на Qt
http://www.prog.org.ru/topic_27102_0.html

Знакомство с последовательным портом
http://www.prog.org.ru/topic_27095_0.html

Использование std::shared_ptr для Qt объектов
http://www.prog.org.ru/topic_27203_0.html

QSslSocket: cannot resolve TLSv1_1_client_method
http://www.prog.org.ru/topic_27208_0.html

Организация файлов Qt-проектов
http://www.prog.org.ru/topic_27290_0.html

Простой пример с прогнозом погоды. Падает приложение.
http://www.prog.org.ru/topic_27303_0.html

QObject::connect: No such slot QObject::replyFinished( )
http://www.prog.org.ru/topic_27231_0.html

Пример из книги Макса Шлее WebBrowser
http://www.prog.org.ru/topic_26054_0.html

IP-адрес неверно парсится
http://www.prog.org.ru/topic_27372_0.html

Организация дел по GTD
http://www.prog.org.ru/topic_27395_0.html

Вывод в консоль
http://www.prog.org.ru/topic_27403_0.html

Qt LINK : fatal error LNK1123: failure during conversion to COFF
http://www.prog.org.ru/topic_27444_0.html

Наиболее эффективный путь изучения OpenGL
http://www.prog.org.ru/topic_27410_0.html

std::cout не выводит в консоль
http://www.prog.org.ru/topic_27429_0.html

Проверка корректности email-адреса
http://www.prog.org.ru/topic_27408_0.html

Организация дел по GTD
http://www.prog.org.ru/topic_27395_0.html

IP-адрес неверно парсится
http://www.prog.org.ru/topic_27372_0.html

Простой пример с прогнозом погоды. Падает приложение.
http://www.prog.org.ru/topic_27303_0.html



Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: kambala от Август 13, 2014, 18:29
Цитировать
Сейчас пишу парсеры сайтов на регулярках
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 13, 2014, 18:34
Цитировать
Сейчас пишу парсеры сайтов на регулярках
http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454
Особенно вот это понравилось :)
Цитировать
Every time you attempt to parse HTML with regular expressions, the unholy child weeps the blood of virgins, and Russian hackers pwn your webapp.


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: __Heaven__ от Август 15, 2014, 16:34
Жду от вас SinglePoint :)
http://www.prog.org.ru/index.php?topic=27475


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 15, 2014, 16:39
Жду от вас SinglePoint :)
http://www.prog.org.ru/index.php?topic=27475
Спасибо большое! Я в той теме напишу :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Август 18, 2014, 07:33
Уверен, что эта информация кому-нибудь здесь пригодится. Нашёл такую книжку: http://www.amazon.com/OpenGL-Programming-Guide-Official-Learning/dp/0321773039/ref=pd_bxgy_b_img_y

Нашёл через eMule: http://www.emule-project.net/home/perl/general.cgi?l=1&rm=download

Открыл eMule и в поиске набрал: OpenGL Programming Guide

Среди найденный, одна нашлась именно восьмого издания с названием файла: Addison-Wesley Professional OpenGL Programming Guide, The Official Guide to Learning OpenGL version 4.3 8th (2013).[sharethefiles.com].pdf

Исходники примеров: http://www.opengl-redbook.com/


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Сентябрь 02, 2014, 12:29
Проблема решена. Наиболее эффективный путь - это постоянная практика! А ещё, сначала изучить СуперКнигу третьего издания (где рассматривается классический OpenGL). Вот диск с примерами: ссылка (http://rutracker.org/forum/viewtopic.php?t=742207). А потом - СуперКнигу новейшего издания, но уже придётся на английском :)


Название: Re: Наиболее эффективный путь изучения OpenGL
Отправлено: Igors от Сентябрь 02, 2014, 13:00
Проблема решена. Наиболее эффективный путь - это постоянная практика!
Ах как свежи и оригинальны Ваши мысли!  :)

OpenGL - это всего лишь "отображение" (рендер). Причем рендер посредственный, т.к. приоритет скорость. И вообще, OpenGL - противоположность 3D где очень мало вещей нужно запоминать. "Вот я хожу по комнатам, смотрю туда-сюда" - в этом нет ничего плохого, но на этом трудно заработать т.к. это умеет делать огромное число людей. И этому можно научиться за неделю-две. Что делать с "отображенным", кто/зачем его купит - пробудите мысли в этом направлении.


Название: Re: [Решено] Наиболее эффективный путь изучения OpenGL
Отправлено: 8Observer8 от Сентябрь 02, 2014, 13:44
Я пока даже по комнате в 3D не научился ходить (точнее камерой управлять) Кому это надо... Надо будет поискать, где можно применить OpenGL кроме игр :)