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

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

Страниц: 1 2 [3] 4 5 ... 7   Вниз
  Печать  
Автор Тема: Примеры из SuperBible под Qt 5.3  (Прочитано 71329 раз)
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

А следующий пример идёт с использованием тесселяции.
А в QGLShader отсутствует такой тип...
Записан
8Observer8
Гость
« Ответ #31 : Август 18, 2014, 13:44 »

Мне кажется, что надо бы в будущем проверять версию OGL driver'а и сообщать пользователю.

Запустил программу, а вместо треугольника зелёное окно и текст ошибки:
Цитировать
Starting C:\Users\Ivan\Dropbox\Qt\SuperBible_6th\downloaded\build-chapter02-Desktop_Qt_5_3_1_MinGW_32bit-Debug\debug\chapter02.exe...
QGLShader::compile(Fragment): ERROR: 0:1: '' :  Version number not supported by OGL driver
ERROR: 0:1: '' : syntax error: #version

QGLShader::compile(Vertex): ERROR: 0:1: '' :  Version number not supported by OGL driver
ERROR: 0:1: '' : syntax error: #version

getProcAddress: Unable to resolve 'glProgramParameteri'
getProcAddress: Unable to resolve 'glProgramParameteriEXT'
QGLShader::compile(Fragment): ERROR: 0:1: '' :  Version number not supported by OGL driver
ERROR: 0:1: '' : syntax error: #version

QGLShader::compile(Vertex): ERROR: 0:1: '' :  Version number not supported by OGL driver
ERROR: 0:1: '' : syntax error: #version
ERROR: 2:4: 'const 4-component vector of float' : cannot declare arrays of this qualifier
ERROR: 2:4: 'const' :  non-matching types (using implicit conversion) for const initializer  
ERROR: 2:8: 'assign' :  cannot convert from 'float' to 'Position 4-component vector of float'

getProcAddress: Unable to resolve 'glProgramParameteri'
getProcAddress: Unable to resolve 'glProgramParameteriEXT'

P.S. Я знаю, что забыл для "chapter02.exe" выставить вторую карту ноутбука.
P.S.S. Конечно ваше дело, но пихать в один проект разные примеры - не очень хорошо. Когда у меня появилось 4 окна, я чуть не обделался! Хотя... tastes differ
« Последнее редактирование: Август 18, 2014, 14:09 от 8Observer8 » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Идея в том, что разбиение примеров идёт по классам. Вы можете закомментировать .show() и получать по одному примеру на запуск
Записан
8Observer8
Гость
« Ответ #33 : Август 18, 2014, 15:28 »

У вас gl_VertexID не объявлен, а всё нормально работает. Поясните, пожалуйста, как вы этот момент понимаете?

Код
C++ (Qt)
   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";
 
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

У вас gl_VertexID не объявлен, а всё нормально работает. Поясните, пожалуйста, как вы этот момент понимаете?
Представьте, что glDrawArrays(GL_TRIANGLES, 0, 3) это тоже самое, что и
Код
C++ (Qt)
glBegin(GL_TRIANGLES);
   for (int gl_VertexID = 0; gl_VertexID < 3; gl_VertexID++)
       ....
glEnd();
« Последнее редактирование: Август 18, 2014, 16:22 от __Heaven__ » Записан
8Observer8
Гость
« Ответ #35 : Август 18, 2014, 16:27 »

Видимо, внутренняя глобальная переменная. А проблемы с анализатором Qt. Всё работает. Просто подчёркивается красным:



P.S. На это можно забить
« Последнее редактирование: Август 18, 2014, 16:29 от 8Observer8 » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Выяснилась одна весёлая вещь про QGLShader и QGLShaderProgram.
Цитировать
This class is obsolete
По этой причине я не нашел как внедрить тесселяцию.
chapter02 был написан именно на них, кстати, примеры из Qt тоже.
Теперь модно использовать QOpenGLShader и QOpenGLShaderProgramm.
Записан
8Observer8
Гость
« Ответ #37 : Август 19, 2014, 16:42 »

Я имею туманное представление о тесселяции. Нашёл такое определение:
Цитировать
Тесселяция в КГА (КГА - компьютерная графика и анимация) - аппроксимация гладкой поверхности множеством элементарных треугольников или многоугольников в процессе создания представления объекта в виде проволочного каркаса

Как мне сейчас представляется, есть два способа построения каркаса объектов:
1) Редакторы типа Blender
2) Генерация внутри программы

Как увязать вместе такие вещи, как: каркас объекта из Blender'а, тесселяцию и эти классы QGLShader и QGLShaderProgram?

Если можно, буквально, пару слов, чтобы не отнимать у вас время.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Способов построения много, если совсем кратко

- стандартные поверхности (напр revolver - фигура вращения, lofter, extruder, sweeper и.т.д)
- SDS редакторы (ну типа "у зайца уши вытягивать", вроде скульпторов)
- NURBS редакторы (рулить семейством кривых)

Тесселяция ко всему этому отношения не имеет - это просто из одного треугольника (полигона) делается несколько. Простая разбивка, триангуляция. Иногда полезно, но, строго говоря, результат некорректный, что бывает очень ощутимо
Записан
8Observer8
Гость
« Ответ #39 : Август 19, 2014, 17:14 »

Способов построения много, если совсем кратко
Спасибо! Есть что гуглить Улыбающийся

А какая связь классов QGLShader и QGLShaderProgram с тесселяцией?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

вы лучше видео по тесселяции посмотрите. их много в сети, там где ландшафты рассматривают.
Запустите пример из sb6, tessellatedtri. Там тоже видна концепция
Записан
8Observer8
Гость
« Ответ #41 : Август 19, 2014, 18:15 »

Спасибо! Посмотрю Улыбающийся
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Тесселяция
Код
C++ (Qt)
#include "tessellatedtri.h"
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QOpenGLVertexArrayObject>
 
TessellatedTri::TessellatedTri(QWidget *parent) :
   QGLWidget(parent)
{
   setWindowTitle("Tessellated Triangle");
}
 
void TessellatedTri::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";
 
 
   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);
 
   program = new QOpenGLShaderProgram(this);
   program->addShader(vs);
   program->addShader(tcs);
   program->addShader(tes);
   program->addShader(fs);
   program->link();
 
   glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
 
   QOpenGLVertexArrayObject* vao = new QOpenGLVertexArrayObject(this);
   vao->bind();
   program->bind();
}
 
void TessellatedTri::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT);
   glDrawArrays(GL_PATCHES, 0, 3);
}
 
void TessellatedTri::resizeGL(int w, int h)
{
   glViewport(0, 0, w, h);
}
 
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Тесселяция
А что будет с "атрибутами" (в первую очередь с нормалями и UV) для созданных вертексов? Они интерполируются автоматычно или как?

(ну вот, опять "пока не готов ответить"  Улыбающийся)
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Я с атрибутами пока не знаком. Нормали только в старом издании краем глаза затронул тему...
Вы сложные вопросы спрашиваете для данного этапа изучения.
Мне кажется, что все нормали будут перпендикулярны плоскостям вновь созданных примитивов, т.н. патчи, которым они принадлежат. Но это только предположение.

Пока что игры с отражениями и т.п. рассматривать не собираюсь, так как в КЭ моделях это не особо нужно. Но вполне возможно, что по пути изучения мне попадется пример, который даст ответ на ваш вопрос. Предполагаю, что нормалями занимается геометрический шейдер.

Кстати, заметил интересную вещь. При компиляции шейдера Qt неявно подставляет в исходники какие-то дефайны. Также при создании объекта в QtCreator на вкладке GLSL можно выбрать вершинный шейдер и фрагментный шейдер. Почему нет остальных....
Записан
Страниц: 1 2 [3] 4 5 ... 7   Вверх
  Печать  
 
Перейти в:  


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