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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Shaders  (Прочитано 3312 раз)
Hait
Гость
« : Май 27, 2017, 20:31 »

Добрый вечер. Пытался написать простую программу с шейдерами, которая должна отобразить нечто на подобии этого. https://hkar.ru/PjEd
На деле же отображает черный экран. Подскажите, где ошибка в коде?
header
Код:
#ifndef MAINWIDGET_H
#define MAINWIDGET_H


#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QString>
#include <QOpenGLShader>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QVector>

class MainWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
    Q_OBJECT

public:
    MainWidget(QWidget *parent = 0);
    ~MainWidget();

protected:
    void initializeGL();
    void resizeGL(int width, int height);
    void paintGL();

private:
    QOpenGLShaderProgram program;
    void initShaders();
    void initData();


//data
    GLuint vbo_position;
    GLuint attribute_vpos;
};

#endif // MAINWIDGET_H


Код:
#include "mainwidget.h"
#include <QMessageBox>
MainWidget::MainWidget(QWidget *parent) :
    QOpenGLWidget(parent)
{
}

MainWidget::~MainWidget()
{

}


void MainWidget::initData()
{
    QVector3D vectdata[] = {QVector3D(-1.0f, -1.0f, 0.0f), QVector3D( 1.0f, -1.0f, 0.0f), QVector3D( 1.0f,  1.0f, 0.0f), QVector3D(-1.0f,  1.0f, 0.0f)};
    glGenBuffers(1, &vbo_position);
    glBindBuffer(GL_ARRAY_BUFFER,  vbo_position);
    glBufferData(GL_ARRAY_BUFFER, sizeof(vectdata), vectdata, GL_STATIC_DRAW);
    glVertexAttribPointer(attribute_vpos, 3, GL_FLOAT, false, 0, 0);

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

void MainWidget::initializeGL()
{
    initializeOpenGLFunctions();

    glClearColor(0, 0, 0, 1);

    initShaders();
}

void MainWidget::initShaders()
{
    // Compile vertex shader
    if (!program.addShaderFromSourceFile((QOpenGLShader::ShaderType)QOpenGLShader::Vertex, ":/vshader.vert"))
        close();

    // Compile fragment shader
    if (!program.addShaderFromSourceFile(QOpenGLShader::Fragment, ":/fshader.frag"))
        close();

    initData();
    // Link shader pipeline
    if (!program.link())
        close();

    // Bind shader pipeline for use
    if (!program.bind())
        close();
}

void MainWidget::resizeGL(int width, int height)
{
    //glViewport(0, 0, width, height);
}

void MainWidget::paintGL()
{
    glClear(GL_COLOR_BUFFER_BIT);
    update();
}

фрагментный
Код:
#version 430

out vec4 FragColor;
in vec3 glPosition;

void main ( void )
{
    FragColor = vec4 ( abs(glPosition.xy), 0, 1.0);
}

вершинный
Код:
#version 430
in vec3 vPosition;
out vec3 glPosition;

void main (void)
{
        gl_Position = vec4(vPosition, 1.0);
        glPosition = vPosition;
}
« Последнее редактирование: Май 28, 2017, 19:22 от Hait » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #1 : Май 28, 2017, 03:43 »

В paintgl очистка, которая в initgl была задана черным, и ненужный update. Вот и выходит черный экран. Вьюпорт раскомментируйте.
Записан
Hait
Гость
« Ответ #2 : Май 28, 2017, 05:52 »

В paintgl очистка, которая в initgl была задана черным, и ненужный update. Вот и выходит черный экран. Вьюпорт раскомментируйте.
Убрал очистку и раскомментировал вьюпорт. Всё равно выводит черный экран

Код:
void MainWidget::resizeGL(int width, int height)
{
    glViewport(0, 0, width, height);
}

void MainWidget::paintGL()
{
    /*
    glClear(GL_COLOR_BUFFER_BIT);
    update();
        */
}
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #3 : Май 28, 2017, 16:13 »

Убрал очистку
Ну и зря Улыбающийся

http://www.prog.org.ru/topic_27475_0.html
Должно помочь начать рисовать.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #4 : Май 28, 2017, 16:21 »

Если короче, то при вызове paintgl не хватает вызова функции рисования примитивов
Кстати, есть удобный класс QOpenGlBuffer. Сочетую познакомиться, как-нибудь
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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