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

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

Страниц: 1 2 3 [4] 5 6 7   Вниз
  Печать  
Автор Тема: Примеры из SuperBible под Qt 5.3  (Прочитано 68205 раз)
8Observer8
Гость
« Ответ #45 : Август 20, 2014, 13:30 »

__Heaven__, в вас отличный стиль оформления примеров! Я просто добавляю ваши новые классы к вашему проекту (всё, как вы задумали). Огромное спасибо за проделанную работу Улыбающийся
« Последнее редактирование: Август 20, 2014, 13:33 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Пока что игры с отражениями и т.п. рассматривать не собираюсь, так как так как в КЭ моделях это не особо нужно
Нормали - это вовсе не "что-то экзотическое", а необходимые данные. Напр источники света без нормалей не имеют смысла. Хотя может быть в "КЭ моделях" и освещать ничего не надо, нарисовал люмой - и все дела Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Пока что игры с отражениями и т.п. рассматривать не собираюсь, так как так как в КЭ моделях это не особо нужно
Нормали - это вовсе не "что-то экзотическое", а необходимые данные. Напр источники света без нормалей не имеют смысла. Хотя может быть в "КЭ моделях" и освещать ничего не надо, нарисовал люмой - и все дела Улыбающийся
Я же правильно понимаю, что при обычном рисовании треугольников через glBegin мы получаем нормали перпендикулярно поверхности примитива?
Если правильно, то получается, зачем мне менять нормали поверхностей тетраэдра, из которых состоит модель. А точнее даже треугольников, из которых состоит оболочка этой модели.
Пока что я рассматриваю OpenGL как инструмент простейшего отображения в пространстве, а не инструмент для получения красивых картинок игрового качества. Для КЭ можно вообще не использовать освещение если вы отобразите сетку поверх модели.
« Последнее редактирование: Август 20, 2014, 13:56 от __Heaven__ » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Я бы даже сказал, что для отображения результатов КЭ, намного лучше отключить использование освещения!
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #49 : Август 20, 2014, 14:12 »

__Heaven__, в вас отличный стиль оформления примеров! Я просто добавляю ваши новые классы к вашему проекту (всё, как вы задумали). Огромное спасибо за проделанную работу Улыбающийся
Ну да, в том и идея. Меня раздражает иметь несколько открытых проектов. Мне легче закомментировать класс в main.
Записан
8Observer8
Гость
« Ответ #50 : Август 20, 2014, 14:23 »

Я так понял, что это компиляция шейдеров:
Код
C++ (Qt)
   QGLShader* fs = new QGLShader(QGLShader::Fragment);
   fs->compileSourceCode(fs_source);
 
   QGLShader* vs = new QGLShader(QGLShader::Vertex);
   vs->compileSourceCode(vs_source);
 

Это добавление:
Код
C++ (Qt)
   program->addShader(vs);
   program->addShader(fs);
 

Это линковка:
Код
C++ (Qt)
program->link();
 

А это связывание:
Код
C++ (Qt)
program->bind();
 

Только я не понял, почему в некоторых примерах отсутствует линковка? Причём там, где она есть, её можно убрать, закомментировав строку: program->link(); И всё равно работает.

Вопрос совершенно несрочный. Можно пока отложить.
« Последнее редактирование: Август 20, 2014, 14:39 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #51 : Август 20, 2014, 14:31 »

И без vao работает. Что это такое и зачем это надо?

Код
C++ (Qt)
   QOpenGLVertexArrayObject* vao = new QOpenGLVertexArrayObject(this);
   vao->bind();
 
« Последнее редактирование: Август 20, 2014, 14:34 от 8Observer8 » Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Я же правильно понимаю, что при обычном рисовании треугольников через glBegin мы получаем нормали перпендикулярно поверхности примитива?
Насколько я знаю, "вообще никаких нормалей не получаем", при любом рисовании, OpenGL их сам не создает. Даже если установлен flat shading (нормаль = нормали к треугольнику), все равно их надо обеспечить. А без освещения получается заливка одним цветом - и вся любовь.

Другой атрибут UV - не менее важен. Напр здесь говорится что используются текстуры (без них смотреть будет не на что). Тогда неясно откуда он взял UV

Ладно, будет время - сам копну, скоро надо будет делать работу с "разбиением на лету"
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #53 : Август 20, 2014, 14:52 »

И без vao работает. Что это такое и зачем это надо?
vao и vbo - это штучки для засылки данных на видеокарту, чтобы они там сидели. Заслав раз можно просто их юзать снова и снова, что существенно быстрее. Иначе при каждом рисовании происходит перегонка данных CPU -> GPU
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Если программа не слинкована перед привязкой, то это происходит автоматом.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #55 : Август 20, 2014, 15:37 »

Оригинальные примеры без vao не работают. Предполагаю, что эта вещь тоже как-то автоматом создаётся.
Правильно ли я понимаю, что vao это тоже, что и glList?
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #56 : Август 20, 2014, 15:53 »

Правильно ли я понимаю, что vao это тоже, что и glList?
Нет, gList это как бы "метафайл" который запоминает все gl вызовы и потом их можно повторить одним glCallList. Это старая техника.

Вообще спецификацию никто не отменял http://www.opengl.org/wiki/Vertex_Specification#Vertex_Array_Object
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #57 : Август 20, 2014, 16:03 »

Прикручиваем геометрический шейдер
Код
C++ (Qt)
#include "tessellatedgstri.h"
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
 
TessellatedGsTri::TessellatedGsTri(QWidget *parent) :
   QGLWidget(parent)
{
   setWindowTitle("Tessellated Geometry Shader Triangle");
}
 
void TessellatedGsTri::initializeGL()
{
   glClearColor(0.0f, 0.25f, 0.0f, 1.0f);
   const char * vs_source =
       "#version 420 core                                                 \n"
       "                                                                  \n"
       "void main(void)                                                   \n"
       "{                                                                 \n"
       "    const vec4 vertices[] = vec4[](vec4( 0.25, -0.25, 0.5, 1.0),  \n"
       "                                   vec4(-0.25, -0.25, 0.5, 1.0),  \n"
       "                                   vec4( 0.25,  0.25, 0.5, 1.0)); \n"
       "                                                                  \n"
       "    gl_Position = vertices[gl_VertexID];                          \n"
       "}                                                                 \n";
 
   const char * fs_source =
       "#version 420 core                             \n"
       "                                              \n"
       "out vec4 color;                               \n"
       "                                              \n"
       "void main(void)                               \n"
       "{                                             \n"
       "    color = vec4(0.0, 0.8, 1.0, 1.0);         \n"
       "}                                             \n";
 
   const char * tcs_source =
       "#version 420 core                                                                 \n"
       "                                                                                  \n"
       "layout (vertices = 3) out;                                                        \n"
       "                                                                                  \n"
       "void main(void)                                                                   \n"
       "{                                                                                 \n"
       "    if (gl_InvocationID == 0)                                                     \n"
       "    {                                                                             \n"
       "        gl_TessLevelInner[0] = 5.0;                                               \n"
       "        gl_TessLevelOuter[0] = 5.0;                                               \n"
       "        gl_TessLevelOuter[1] = 5.0;                                               \n"
       "        gl_TessLevelOuter[2] = 5.0;                                               \n"
       "    }                                                                             \n"
       "    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;     \n"
       "}                                                                                 \n";
 
   const char * tes_source =
       "#version 420 core                                                                 \n"
       "                                                                                  \n"
       "layout (triangles, equal_spacing, cw) in;                                         \n"
       "                                                                                  \n"
       "void main(void)                                                                   \n"
       "{                                                                                 \n"
       "    gl_Position = (gl_TessCoord.x * gl_in[0].gl_Position) +                       \n"
       "                  (gl_TessCoord.y * gl_in[1].gl_Position) +                       \n"
       "                  (gl_TessCoord.z * gl_in[2].gl_Position);                        \n"
       "}                                                                                 \n";
 
   static const char * gs_source =
           "#version 420 core                                                                  \n"
           "                                                                                   \n"
           "layout (triangles) in;                                                             \n"
           "layout (points, max_vertices = 3) out;                                             \n"
           "                                                                                   \n"
           "void main(void)                                                                    \n"
           "{                                                                                  \n"
           "    int i;                                                                         \n"
           "                                                                                   \n"
           "    for (i = 0; i < gl_in.length(); i++)                                           \n"
           "    {                                                                              \n"
           "        gl_Position = gl_in[i].gl_Position;                                        \n"
           "        EmitVertex();                                                              \n"
           "    }                                                                              \n"
           "}                                                                                  \n";
 
   QOpenGLShader* fs = new QOpenGLShader(QOpenGLShader::Fragment, this);
   fs->compileSourceCode(fs_source);
 
   QOpenGLShader* vs = new QOpenGLShader(QOpenGLShader::Vertex, this);
   vs->compileSourceCode(vs_source);
 
   QOpenGLShader* tcs = new QOpenGLShader(QOpenGLShader::TessellationControl, this);
   tcs->compileSourceCode(tcs_source);
 
   QOpenGLShader* tes = new QOpenGLShader(QOpenGLShader::TessellationEvaluation, this);
   tes->compileSourceCode(tes_source);
 
   QOpenGLShader* gs = new QOpenGLShader(QOpenGLShader::Geometry, this);
   gs->compileSourceCode(gs_source);
 
   program = new QOpenGLShaderProgram(this);
   program->addShader(vs);
   program->addShader(tcs);
   program->addShader(tes);
   program->addShader(gs);
   program->addShader(fs);
   program->link();
 
   glPointSize(5.0f);
 
   QOpenGLVertexArrayObject* vao = new QOpenGLVertexArrayObject(this);
   vao->bind();
   program->bind();
}
 
void TessellatedGsTri::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT);
   glDrawArrays(GL_PATCHES, 0, 3);
}
 
void TessellatedGsTri::resizeGL(int w, int h)
{
   glViewport(0, 0, w, h);
}
 
Записан
8Observer8
Гость
« Ответ #58 : Август 20, 2014, 18:17 »

__Heaven__, переписываю за вами примеры. Моя навигация здесь: http://www.prog.org.ru/index.php?topic=27475.msg199288#msg199288

Делаю с стиле CAD-приложений:
« Последнее редактирование: Август 20, 2014, 18:22 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #59 : Август 21, 2014, 06:54 »

По-моему, это единственная книга на русском по GLSL: http://www.ozon.ru/context/detail/id/2619774/

Вот здесь можно скачать книгу и диск к книге: http://www.twirpx.com/file/1134216/

Из содержания:
Записан
Страниц: 1 2 3 [4] 5 6 7   Вверх
  Печать  
 
Перейти в:  


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