Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2014, 12:06   #1
Wollen
 
Регистрация: 05.11.2014
Сообщений: 3
По умолчанию Qt шейдер "рыбий глаз"

Нужно написать шейдер эффекта "рыбий глаз".
В интернете много примеров шейдеров, но не совсем понятно как и использовать.
Взял шейдер с этого сайта http://pixelsorcery.wordpress.com/20...vertex-shader/
Пытаюсь подключить его
PHP код:
#include "glwidget.h"
#include <QResizeEvent>
#include <QGLShader>
#include <QGLShaderProgram>
#include <QFileInfo>
#include <math.h>
#include <GL/glu.h>

GLWidget::GLWidget(QWidget *parent) : QGLWidget(parent)
{
    
makeCurrent();
    
shaderProgram NULL;
    
vertexShader NULL;
    
fragmentShader NULL;
    
startTimer(25);
    
isShader true;
}

GLWidget::~GLWidget()
{
    
delete shaderProgram;
    
delete vertexShader;
    
delete fragmentShader;
}
void GLWidget::shaderToggle(int x)
{
    if(
== 0){
        
isShader true;
        
qDebug()<<"Шейдер включен";
    }
    if(
== 2){
        
isShader false;
        
qDebug()<<"Шейдер выключен";
    }
}

void GLWidget::initializeGL()
{
    
loadShader("D:/Program Files/C++ Qt/lab5/fish.vsh""D:/Program Files/C++ Qt/lab5/fish.fsh");
    
0;
    
frameCounter 0;
}

void GLWidget::resizeGL(int widthint height)
{
    
glViewport(00widthheight);
    
glMatrixMode(GL_PROJECTION);

    
glLoadIdentity();
    
gluPerspective(45.,((GLfloat)width)/((GLfloat)height),0.1f,1000.0f);

    
glMatrixMode(GL_MODELVIEW);
    
glLoadIdentity();
}

void GLWidget::paintGL()
{
    if(
isShader) {
        
QMatrix4x4 m;
        
m.setToIdentity();
        
shaderProgram->setUniformValue("camera_pos",m);
        
shaderProgram->bind();
    }
    
glLoadIdentity();
    
glClear(GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT);
    
glClearColor(0.75f0.75f0.75f0.0f);
    
frameCounter ++;
    
glTranslatef(0.0f0.0f, -5.0f);
    
glRotatef(frameCounter,0.0f,0.0f,0.5f);
    
qglColor(Qt::green);
    
glBegin(GL_QUADS);
        
glVertex3f(-1.0, -1.0,0.0);
        
glVertex3f(1.0, -1.0,0.0);
        
glVertex3f(1.01.0,0.0);
        
glVertex3f(-1.01.0,0.0);
    
glEnd();
    
+= 0.1;
    if(
isShader){
        
shaderProgram->release();
    }
}

void GLWidget::loadShader(const QString &vshader, const QString &fshader)
{
    if(
shaderProgram)
        {
        
shaderProgram->release();
        
shaderProgram->removeAllShaders();
        }
    else 
shaderProgram = new QGLShaderProgram;

    if(
vertexShader)
        {
        
delete vertexShader;
        
vertexShader NULL;
        }

    if(
fragmentShader)
        {
        
delete fragmentShader;
        
fragmentShader NULL;
        }


    
QFileInfo vsh(vshader);
    if(
vsh.exists())
        {
        
vertexShader = new QGLShader(QGLShader::Vertex);
        if(
vertexShader->compileSourceFile(vshader))
            
shaderProgram->addShader(vertexShader);
        else 
qWarning() << "Vertex Shader Error" << vertexShader->log();
        }
    else 
qWarning() << "Vertex Shader source file " << vshader << " not found.";


    
// load and compile fragment shader
    
QFileInfo fsh(fshader);
    if(
fsh.exists())
        {
        
fragmentShader = new QGLShader(QGLShader::Fragment);
        if(
fragmentShader->compileSourceFile(fshader))
            
shaderProgram->addShader(fragmentShader);
        else 
qWarning() << "Fragment Shader Error" << fragmentShader->log();
        }
    else 
qWarning() << "Fragment Shader source file " << fshader << " not found.";

    if(!
shaderProgram->link())
        {
        
qWarning() << "Shader Program Linker Error" << shaderProgram->log();
        }
}
void GLWidget::timerEvent(QTimerEvent *)
{
    
updateGL();

Шейдер не работает. Судя по всему из-за того, что не правильно передаю параметр uniform vec4 camera_pos. А как его правильно передать?
Прикладываю полный проект. Помогите пожалуйста.
Вложения
Тип файла: rar lab5.rar (5.8 Кб, 13 просмотров)
Wollen вне форума Ответить с цитированием
Старый 05.11.2014, 12:52   #2
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

У меня не получилось ваш пример запустить, так как сам с шейдерами только знакомлюсь. Я правильно подключил, как мне кажется

Цитата:
Пытаюсь подключить его
Я прикрепил проект, в котором подключаются шейдеры и выводится треугольник
Вложения
Тип файла: zip ShaderTriangle.zip (6.0 Кб, 25 просмотров)
8Observer8 вне форума Ответить с цитированием
Старый 05.11.2014, 18:39   #3
Wollen
 
Регистрация: 05.11.2014
Сообщений: 3
По умолчанию

Цитата:
Сообщение от 8Observer8 Посмотреть сообщение
Я прикрепил проект, в котором подключаются шейдеры и выводится треугольник
Спасибо!
Хотелось бы ещё всё-таки увидеть какой-нибудь проект, где шейдер накладывает графический эффект на изображение и посмотреть как ему передаются параметры.
Wollen вне форума Ответить с цитированием
Старый 05.02.2015, 11:12   #4
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Сообщение от Wollen Посмотреть сообщение
Шейдер не работает. Судя по всему из-за того, что не правильно передаю параметр uniform vec4 camera_pos. А как его правильно передать?
Вот вы присваиваете значение переменной 'camera_pos' (то есть передаёте значение в шейдер):

Код:
    QMatrix4x4 m; 
    m.setToIdentity(); 
    shaderProgram->setUniformValue("camera_pos",m);
А в шейдере у вас 'camera_pos' типа vec4
Код:
    uniform vec4 camera_pos;
Это разные типы: вектор и матрица

Нужно передавать позицию камеры:

Код:
    shaderProgram->setUniformValue("camera_pos", QVector4D( 0.0f, 0.0f, -10.0f, 0.0f ) );
Перед 'рыбьим глазом' нужно сначала разобраться с математикой освещения. Вот отличная статья для начинающих --> ссылка

Научитесь сначала выводить квадрат с наложенной текстурой под освещением diffuse+specular, а потом уже перейдёте к 'рыбьему глазу'

Последний раз редактировалось 8Observer8; 05.02.2015 в 11:19.
8Observer8 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Эффект линзы или "рыбий глаз" 13th Свободное общение 0 27.05.2012 23:32
Вывести название соответствующей карты вида "шестерка бубен", "дама червей","туз треф" и т.п. воваава Помощь студентам 3 01.12.2011 12:50
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04