Fix a couple of bugs in the QOpenGLWindow example

Also make the fragment shader a bit simpler

Change-Id: Ie50940da0a4f896504c9f5962cdb6c455983302f
Reviewed-by: Laszlo Agocs <laszlo.agocs@theqtcompany.com>
This commit is contained in:
Jørgen Lind 2015-01-06 14:55:30 +01:00
parent c2b86ade9e
commit cd7532ad7b
3 changed files with 18 additions and 12 deletions

View File

@ -1,3 +1,6 @@
#define M_PI 3.1415926535897932384626433832795
#define SPEED 10000.0
uniform int currentTime; uniform int currentTime;
uniform highp vec2 windowSize; uniform highp vec2 windowSize;
@ -8,18 +11,20 @@ highp float noise(highp vec2 co)
highp float curvSpeed() highp float curvSpeed()
{ {
return mod(float(currentTime), 1000000.0) / 500.0; return (mod(float(currentTime), SPEED) / SPEED) * (2.0 * M_PI);
} }
highp float curv() highp float curv(int curvCount)
{ {
return 1.0 - abs((gl_FragCoord.y / (windowSize.y / 10.0) - 5.0) - sin((gl_FragCoord.x / (windowSize.x/20.0)) - curvSpeed())); highp float curv_y = 0.1 *(cos((gl_FragCoord.x / windowSize.x) * (float(curvCount * 2) * M_PI) - curvSpeed())) + 0.5;
highp float frag_y = gl_FragCoord.y / windowSize.y;
return 1.0 - abs(curv_y - frag_y);
} }
void main() void main()
{ {
highp float coordNoise = noise(gl_FragCoord.xy); highp float coordNoise = noise(gl_FragCoord.xy);
highp float proximity = smoothstep(0.5, 1.0, (curv() + 1.0) * (coordNoise )); highp float proximity = smoothstep(0.85, 1.0, (curv(6) + 1.0) * (coordNoise ));
highp vec3 color = vec3(coordNoise) * proximity; highp vec3 color = vec3(coordNoise) * proximity;
gl_FragColor = vec4(color, 1.0); gl_FragColor = vec4(color, 1.0);
} }

View File

@ -75,8 +75,8 @@ FragmentToy::FragmentToy(const QString &fragmentSource, QObject *parent)
m_fragment_file_last_modified = info.lastModified(); m_fragment_file_last_modified = info.lastModified();
m_fragment_file = fragmentSource; m_fragment_file = fragmentSource;
#ifndef QT_NO_FILESYSTEMWATCHER #ifndef QT_NO_FILESYSTEMWATCHER
m_watcher.addPath(info.canonicalFilePath()); m_watcher.addPath(info.canonicalPath());
QObject::connect(&m_watcher, &QFileSystemWatcher::fileChanged, this, &FragmentToy::fileChanged); QObject::connect(&m_watcher, &QFileSystemWatcher::directoryChanged, this, &FragmentToy::fileChanged);
#endif #endif
} }
} }
@ -94,7 +94,7 @@ void FragmentToy::draw(const QSize &windowSize)
if (!m_vao.isCreated()) if (!m_vao.isCreated())
m_vao.create(); m_vao.create();
m_vao.bind(); QOpenGLVertexArrayObject::Binder binder(&m_vao);
if (!m_vertex_buffer.isCreated()) { if (!m_vertex_buffer.isCreated()) {
m_vertex_buffer.create(); m_vertex_buffer.create();
@ -115,7 +115,7 @@ void FragmentToy::draw(const QSize &windowSize)
} }
} }
if (!m_fragment_shader) { if (!m_fragment_shader && m_recompile_shaders) {
QByteArray data; QByteArray data;
if (m_fragment_file.size()) { if (m_fragment_file.size()) {
QFile file(m_fragment_file); QFile file(m_fragment_file);
@ -160,6 +160,9 @@ void FragmentToy::draw(const QSize &windowSize)
} }
if (!m_program->isLinked())
return;
m_program->bind(); m_program->bind();
m_vertex_buffer.bind(); m_vertex_buffer.bind();
@ -167,15 +170,13 @@ void FragmentToy::draw(const QSize &windowSize)
m_program->enableAttributeArray("vertexCoord"); m_program->enableAttributeArray("vertexCoord");
m_vertex_buffer.release(); m_vertex_buffer.release();
float radiens = (QTime::currentTime().msecsSinceStartOfDay() / 60) / (2 * M_PI); uint time = QDateTime::currentDateTime().toMSecsSinceEpoch();
m_program->setUniformValue("currentTime", (uint) QDateTime::currentDateTime().toMSecsSinceEpoch()); m_program->setUniformValue("currentTime", (uint) QDateTime::currentDateTime().toMSecsSinceEpoch());
m_program->setUniformValue("radiens", radiens);
m_program->setUniformValue("windowSize", windowSize); m_program->setUniformValue("windowSize", windowSize);
QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); QOpenGLContext::currentContext()->functions()->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
m_program->release(); m_program->release();
m_vao.release();
} }
void FragmentToy::fileChanged(const QString &path) void FragmentToy::fileChanged(const QString &path)

View File

@ -97,7 +97,7 @@ private:
// typical in pure QWindow-based applications. // typical in pure QWindow-based applications.
OpenGLWindow::OpenGLWindow() OpenGLWindow::OpenGLWindow()
: QOpenGLWindow(QOpenGLWindow::NoPartialUpdate) : QOpenGLWindow(QOpenGLWindow::NoPartialUpdate)
, m_fragment_toy("background.frag") , m_fragment_toy("./background.frag")
, m_text_layout("The triangle and this text is rendered with QPainter") , m_text_layout("The triangle and this text is rendered with QPainter")
, m_animate(true) , m_animate(true)
{ {