Russian Qt Forum
Июнь 17, 2024, 03:34 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3 4 5   Вниз
  Печать  
Автор Тема: [Решено] Наиболее эффективный путь изучения OpenGL  (Прочитано 33806 раз)
8Observer8
Гость
« Ответ #15 : Август 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)
 
 
Записан
8Observer8
Гость
« Ответ #16 : Август 07, 2014, 09:21 »

__Heaven__, как вы думаете, примеры из "SuperBible" 6 изд. возможно будет на Qt переделать? Я смотрю там какие-то свои библиотеки и все они "lib"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Август 07, 2014, 09:22 »

Как сделать паузу в Visual C++ 2010?
Property - Linker - System, значение SubSystem = Console, тогда имеете стандартный ввод-вывод
Записан
8Observer8
Гость
« Ответ #18 : Август 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
Записан
8Observer8
Гость
« Ответ #19 : Август 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;
           }
 
Записан
8Observer8
Гость
« Ответ #20 : Август 07, 2014, 09:55 »

Получается, что функция glfwOpenWindow завершается ошибкой. Что теперь делать? Как это исправлять?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #21 : Август 07, 2014, 11:40 »

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

__Heaven__, в 6-м издании абсолютно все примеры на GLSL, С++ и WinAPI. Причём C++ используется никак процедурный, а как ООП Улыбающийся

Я застрял на том, что функция glfwOpenWindow во всех примерах возвращает false. Не могу понять в чём дело: https://www.opengl.org/discussion_boards/showthread.php/176821-glfwOpenWindow
Записан
8Observer8
Гость
« Ответ #23 : Август 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;
}
 

Как узнать почему?
Записан
8Observer8
Гость
« Ответ #24 : Август 07, 2014, 12:51 »

Кстати, оказывается GLFW мне не нужен. Так как этот фреймворк используется для создания GUI. Зачем мне GUI на GLFW если есть Qt Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #25 : Август 07, 2014, 13:01 »

Кстати, оказывается GLFW мне не нужен. Так как этот фреймворк используется для создания GUI. Зачем мне GUI на GLFW если есть Qt Улыбающийся
Именно это я Вам и пытался донести.
Записан
8Observer8
Гость
« Ответ #26 : Август 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();
}
 
« Последнее редактирование: Август 07, 2014, 14:40 от 8Observer8 » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #27 : Август 08, 2014, 08:31 »

Я сегодня столкнулся с проблемой.
Захотелось мне запустить свое приложение под android. В итоге на этапе компиляции вылетела ошибка о том, что не известно, кто такие glMatrixMode, glOrtho и т.д.
Кто знает, имеет ли смысл изучать обычные функции openGL или рваться за GLSL, если речь идёт об Android?
Записан
navrocky
Гипер активный житель
*****
Offline Offline

Сообщений: 817


Погроммист


Просмотр профиля
« Ответ #28 : Август 08, 2014, 08:47 »

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

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

Гугль в помощь
8Observer8
Гость
« Ответ #29 : Август 08, 2014, 09:38 »

__Heaven__, как я понимаю, вы скачали, что-то типа: "Qt 5.3.1 for Android (Windows 32-bit, 814 MB)" Есть ли там эмулятор для Android?
Записан
Страниц: 1 [2] 3 4 5   Вверх
  Печать  
 
Перейти в:  


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