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

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

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

Сообщений: 2130



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

Основную сложность создало незнание классов Qt и что такое vao, у меня пока не отложилось.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Под убунту удалось запустить. Дело было в том, что у меня по каким-то причинам не поддерживается новая версия opengl. Пришлось использовать строчку
Код:
"#version 130                             \n"
Точка отрисовалась голубой.
Записан
8Observer8
Гость
« Ответ #17 : Август 18, 2014, 06:16 »

Под убунту удалось запустить. Дело было в том, что у меня по каким-то причинам не поддерживается новая версия opengl. Пришлось использовать строчку
Код:
"#version 130                             \n"
Точка отрисовалась голубой.

Врядли следующая информация будет для вас полезна. Но а вдруг! Улыбающийся Дело в том, что я не мог запустить примеры на своём ноутбуке Asus X53S. Примеры изначально идут для Visual Studio. Для себя на память написал такую инструкцию:

Инструкция по запуску примеров из 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"
« Последнее редактирование: Август 18, 2014, 06:18 от 8Observer8 » Записан
8Observer8
Гость
« Ответ #18 : Август 18, 2014, 06:23 »

Если вы работаете на ноутбуке, то обратите внимание на то, что у него может быть две видеокарты. Одна мощная, а вторая слабая. Вторая используется поумолчанию (для экономии энергии)

Чтобы узнать версии OpenGL и GLSL, запустите у себя такую программу:
Код
C++ (Qt)
#include <QGLFormat>
#include <QGLWidget>
#include <QString>
#include <iostream>
#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 vendor( QLatin1String( reinterpret_cast<const char*>( glGetString( GL_VENDOR ) ) ) );
   std::cout << "Vendor: " << vendor.toStdString() << std::endl;
 
   QString renderer( QLatin1String( reinterpret_cast<const char*>( glGetString( GL_RENDERER ) ) ) );
   std::cout << "Renderer: " << renderer.toStdString() << std::endl;
 
   QString versionOfGL( QLatin1String( reinterpret_cast<const char*>( glGetString( GL_VERSION ) ) ) );
   std::cout << "Version: " << versionOfGL.toStdString() << std::endl;
 
   QString versionGLSL( QLatin1String( reinterpret_cast<const char*>( glGetString( GL_SHADING_LANGUAGE_VERSION ) ) ) );
   std::cout << "GLSL: "<< versionGLSL.toStdString() << std::endl;
 
   return app.exec();
}
 
Записан
8Observer8
Гость
« Ответ #19 : Август 18, 2014, 07:18 »

Уверен, что эта информация кому-нибудь здесь пригодится. Нашёл такую книжку: 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/
« Последнее редактирование: Август 18, 2014, 07:31 от 8Observer8 » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Готов треугольник.

Код
C++ (Qt)
#include "singletri.h"
#include <QGLShader>
#include <QGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QPainter>
 
SingleTri::SingleTri(QWidget *parent) :
   QGLWidget(parent)
{
   setWindowTitle("Single Triangle");
}
 
void SingleTri::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";
   QGLShader* fs = new QGLShader(QGLShader::Fragment);
   fs->compileSourceCode(fs_source);
 
   QGLShader* vs = new QGLShader(QGLShader::Vertex);
   vs->compileSourceCode(vs_source);
 
   program = new QGLShaderProgram(this);
   program->addShader(vs);
   program->addShader(fs);
 
   QOpenGLVertexArrayObject* vao = new QOpenGLVertexArrayObject(this);
   vao->bind();
   program->bind();
}
 
void SingleTri::paintGL()
{
   glClear(GL_COLOR_BUFFER_BIT);
   glDrawArrays(GL_TRIANGLES, 0, 3);
}
 
void SingleTri::resizeGL(int w, int h)
{
   glViewport(0, 0, w, h);
}
 

Чтобы узнать версии под убунту, достаточно ввести glxinfo | grep version

Я обнаружил, что под виндой у меня на нетбуке вырисовывается белая точка, а на рабочей станции все ок - голубая.
Помнится, была игра "Бей орков!", которую я хотел запустить на не самой хорошей видеокарте - итогом был чёрный экран со звуками. Я хочу этим сказать, что, скорее всего, версия, которую мы указываем первой строкой, непосредственно связана с железом/драйверами.
Под убунту мне удалось запустить точку, указав версию 130 (без core). Это же действие помогло покрасить белую точку на нетбуке под виндой (даже разрешили мне добавить core).

На нетбуке у меня имеется только одна видеокарта - интегрированная, соответственно, маломощная.
« Последнее редактирование: Август 18, 2014, 09:28 от __Heaven__ » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Изменил первый пост и выложил примеры в нем из второй главы.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Код
C++ (Qt)
   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";
 
А почему это отображается? Ну есть переменная color, разве это какое-то predefined имя? Раньше надо было заполнить gl_FragColor. И с камерой неясно - это изометрия или перспектива?
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Игорь, это работа так называемого конвейера.
В первом приближении для отрисовки точки нам необходимо реализовать gl программу, состоящую из двух шейдеров: вершинный (в данном примере позиция) и фрагментный (цвет).
Мне кажется, что это изометрия. Думаю, что скоро смогу с уверенностью ответить на этот вопрос.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Да, color это некий predifined
Записан
8Observer8
Гость
« Ответ #25 : Август 18, 2014, 09:52 »

__Heaven__, спасибо, что продолжаете эту очень полезную тему! Хотелось бы, чтобы вашего энтузиазма хватило для всех примеров Улыбающийся

Предлагаю в самом первом сообщении темы написать содержание для удобства:

Содержание
- SinglePoint
- SingleTri
- Moving Triangle
« Последнее редактирование: Август 19, 2014, 16:44 от 8Observer8 » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Скажу сразу, что энтузиазма на всё не хватит.
Моя цель - работа с конечно-элементной сеткой (возможно под ES).
Но, постараюсь раскрыть тему в плане связки Qt и OpenGL 4.x.
Всякие штуки как тесселяция меня пока что не интересуют, но, быть может мне когда-нибудь придется писать свой сеточный генератор и это будет необходимо для отображения поверхностей при диком увеличении. Но это только мечты.
Насчёт оглавления ещё подумаю.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


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

Игорь, это работа так называемого конвейера.
В первом приближении для отрисовки точки нам необходимо реализовать gl программу, состоящую из двух шейдеров: вершинный (в данном примере позиция) и фрагментный (цвет).
А по-другому никогда и не было, без вертексного шейдера нельзя (даже если там ничего делать не хотел)

Да, color это некий predifined
Ну как-то это не вяжется - покажите где это написано. Может просто "последнее возвращаемое значение"? Что будет если color заменить напр на "myColor"?

Моя цель - работа с конечно-элементной сеткой (возможно под ES).
Расскажите подробнее (если хотите), может чего и посоветую

По поводу подхода - мне лично он не очень. Почему бы не взять работающий пример, вот hellogl_es2 (именно es2) и туда уже встраивать содержательную часть супер-библии? Возможно Вы хотите научиться создавать OpenGL приложение "с нуля" - в этом есть смысл, но это не очень практично.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Да, немного обманул. Извиняюсь.
Цитировать
Next, it declares color as an output variable using the out keyword. In fragment shaders, the value of output variables will be sent to the window or screen.

По поводу моей задачи:
Как уже описывал в одной из проблем (там имеется вложенный проект), имеется отливка в форме (см. литейное производство).
И отливка и форма представляют из себя набор двумерных элементов, т.н. freefaces, которые получаются путём обработки моделей, состоящих из элементов tetra4.
Отливку мне необходимо отображать одним цветом (красным), форму - другим (синим). Помимо этого на элементы нужно нанести сетку без z-fighting.
Захотел я это всё запустить на Андроид и огорчился, когда узнал, что ES не понимает, что такое glMatrix, glOrtho и т.д.

Насчёт hellogl_es2.
Я его часто перечитываю и извлекаю нужное мне. Я хочу, чтобы в программе было всё необходимое и ничего лишнего. А также разбивать проекты по главам.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



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

Анимируем треугольник с использованием глобальных переменных в шейдере
Код
C++ (Qt)
#include "movingtri.h"
#include <QGLShader>
#include <QGLShaderProgram>
#include <QOpenGLVertexArrayObject>
#include <QPainter>
#include <QTime>
#include <math.h>
#include <QVector4D>
 
MovingTri::MovingTri(QWidget *parent) :
   QGLWidget(parent)
{
   setWindowTitle("Moving Triangle");
   time = new QTime;
   time->start();
   startTimer(33);
}
 
MovingTri::~MovingTri()
{
   delete time;
}
 
void MovingTri::initializeGL()
{
   const char * vs_source =
       "#version 410 core                                                 \n"
       "                                                                  \n"
       "layout (location = 0) in vec4 offset;                             \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"
       "    // Add 'offset' to our hard-coded vertex position             \n"
       "    gl_Position = vertices[gl_VertexID] + offset;                 \n"
       "}                                                                 \n";
   const char * fs_source =
       "#version 410 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";
   QGLShader* fs = new QGLShader(QGLShader::Fragment);
   fs->compileSourceCode(fs_source);
 
   QGLShader* vs = new QGLShader(QGLShader::Vertex);
   vs->compileSourceCode(vs_source);
 
   program = new QGLShaderProgram(this);
   program->addShader(vs);
   program->addShader(fs);
   program->link();
 
   QOpenGLVertexArrayObject* vao = new QOpenGLVertexArrayObject(this);
   vao->bind();
   program->bind();
}
 
void MovingTri::paintGL()
{
   GLfloat currentTime = time->elapsed() / 1000.0f;
 
   glClearColor(sinf(currentTime) * 0.5f + 0.5f,
                cosf(currentTime) * 0.5f + 0.5f,
                0.0f, 1.0f);
   glClear(GL_COLOR_BUFFER_BIT);
 
 
   QVector4D attrib
   (
       sinf(currentTime) * 0.5f,
       cosf(currentTime) * 0.6f,
       0.0f,
       0.0f
   );
 
   program->setAttributeValue(0, attrib);
 
   glDrawArrays(GL_TRIANGLES, 0, 3);
}
 
void MovingTri::resizeGL(int w, int h)
{
   glViewport(0, 0, w, h);
}
 
void MovingTri::timerEvent(QTimerEvent *)
{
   updateGL();
}
 
Записан
Страниц: 1 [2] 3 4 ... 7   Вверх
  Печать  
 
Перейти в:  


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