Название: Shaders
Отправлено: 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; }
Название: Re: Shaders
Отправлено: __Heaven__ от Май 28, 2017, 03:43
В paintgl очистка, которая в initgl была задана черным, и ненужный update. Вот и выходит черный экран. Вьюпорт раскомментируйте.
Название: Re: Shaders
Отправлено: Hait от Май 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(); */ }
Название: Re: Shaders
Отправлено: __Heaven__ от Май 28, 2017, 16:13
Убрал очистку
Ну и зря :) http://www.prog.org.ru/topic_27475_0.html Должно помочь начать рисовать.
Название: Re: Shaders
Отправлено: __Heaven__ от Май 28, 2017, 16:21
Если короче, то при вызове paintgl не хватает вызова функции рисования примитивов Кстати, есть удобный класс QOpenGlBuffer. Сочетую познакомиться, как-нибудь
|