red area is drawn

master
Benjamin Kraft 3 years ago
parent c854157c9e
commit 0548e61f8a
  1. 6
      Fragment.glsl
  2. 6
      Vertex.glsl
  3. 6
      headers/Mandelbrot.h
  4. 7
      headers/OutputWidget.h
  5. 39
      src/Mandelbrot.cpp
  6. 47
      src/OutputWidget.cpp

@ -0,0 +1,6 @@
#version 330 core
out vec4 pixColor;
void main(){
pixColor = vec4(1., 0., 0., 1);
}

@ -0,0 +1,6 @@
#version 330 core
layout (location = 0) in vec2 position;
void main(){
gl_Position = vec4(position.x, position.y, 0.0, 1.);
}

@ -3,19 +3,17 @@
#include <QVector2D> #include <QVector2D>
#include <QOpenGLExtraFunctions> #include <QOpenGLExtraFunctions>
#include <QOpenGLShaderProgram>
class Mandelbrot : public QObject, protected QOpenGLExtraFunctions { class Mandelbrot : public QObject, protected QOpenGLExtraFunctions {
Q_OBJECT Q_OBJECT
public: public:
void init(); void init();
void draw(); void draw(GLuint, int, QOpenGLShaderProgram&);
void zoom(double); void zoom(double);
public slots: public slots:
void setIterations(int); void setIterations(int);
private: private:
static float* genVertices();
GLuint createVAO();
GLuint vao;
int iterations = 0; int iterations = 0;
double scale = 1; double scale = 1;
QVector2D translation; QVector2D translation;

@ -22,6 +22,13 @@ private:
void mouseReleaseEvent(QMouseEvent*) override; void mouseReleaseEvent(QMouseEvent*) override;
void keyPressEvent(QKeyEvent*) override; void keyPressEvent(QKeyEvent*) override;
void initShader();
static std::vector<QVector2D> genVertices();
GLuint createVAO();
GLuint vao;
int vertCount;
QOpenGLShaderProgram shader;
Mandelbrot mandelbrot; Mandelbrot mandelbrot;
}; };

@ -3,12 +3,13 @@
void Mandelbrot::init() { void Mandelbrot::init() {
initializeOpenGLFunctions(); initializeOpenGLFunctions();
vao = createVAO();
} }
void Mandelbrot::draw() { void Mandelbrot::draw(GLuint vao, int vertCount, QOpenGLShaderProgram& shader) {
shader.bind();
glBindVertexArray(vao);
glDrawArrays(GL_QUADS, 0, vertCount);
glBindVertexArray(0);
} }
void Mandelbrot::zoom(double delta) { void Mandelbrot::zoom(double delta) {
@ -19,34 +20,4 @@ void Mandelbrot::setIterations(int value) {
iterations = value; iterations = value;
} }
GLuint Mandelbrot::createVAO() {
GLuint vboId;
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
float* vertices = genVertices();
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
GLuint vaoId;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 2 * sizeof(float), (void*) nullptr);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
return vaoId;
}
float* Mandelbrot::genVertices() {
return new float[8]{
-1, -1,
1, -1,
1, 1,
-1, 1
};
}

@ -1,5 +1,6 @@
#include <iostream> #include <iostream>
#include <QResource>
#include "../headers/OutputWidget.h" #include "../headers/OutputWidget.h"
using std::cout, std::endl; using std::cout, std::endl;
@ -8,20 +9,64 @@ void OutputWidget::initializeGL() {
cout << "Initialize OpenGL" << endl; cout << "Initialize OpenGL" << endl;
initializeOpenGLFunctions(); initializeOpenGLFunctions();
getMandelbrot()->init(); getMandelbrot()->init();
initShader();
auto format = this->format(); auto format = this->format();
cout << "OpenGL version: " << format.majorVersion() << "." << format.minorVersion() << endl; cout << "OpenGL version: " << format.majorVersion() << "." << format.minorVersion() << endl;
vao = createVAO();
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
} }
void OutputWidget::paintGL() { void OutputWidget::paintGL() {
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
getMandelbrot()->draw(); getMandelbrot()->draw(vao, vertCount, shader);
} }
void OutputWidget::resizeGL(int w, int h) { void OutputWidget::resizeGL(int w, int h) {
//glViewport(0, 0, w, h);
}
GLuint OutputWidget::createVAO() {
GLuint vboId;
glGenBuffers(1, &vboId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
auto vertices = genVertices();
size_t size = vertices.size() * sizeof(QVector2D);
vertCount = int(vertices.size());
glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)size, &vertices[0], GL_STATIC_DRAW);
GLuint vaoId;
glGenVertexArrays(1, &vaoId);
glBindVertexArray(vaoId);
glBindBuffer(GL_ARRAY_BUFFER, vboId);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(QVector2D), (GLvoid const*) 0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
return vaoId;
}
std::vector<QVector2D> OutputWidget::genVertices() {
return {
{-1, -1},
{1, -1},
{1, 1},
{-1, 1}
};
}
void OutputWidget::initShader() {
if (!shader.addShaderFromSourceFile(QOpenGLShader::Vertex, "Vertex.glsl")) close();
if (!shader.addShaderFromSourceFile(QOpenGLShader::Fragment, "Fragment.glsl")) close();
if (!shader.link()) close();
if (!shader.bind()) close();
} }
void OutputWidget::wheelEvent(QWheelEvent *e) { void OutputWidget::wheelEvent(QWheelEvent *e) {

Loading…
Cancel
Save