src/gl/compiler.cpp

changeset 53
3af627f7a40f
parent 51
1a9eac27698d
child 73
97df974b5ed5
equal deleted inserted replaced
52:eee644f88e93 53:3af627f7a40f
128 128
129 gl::Compiler::~Compiler() 129 gl::Compiler::~Compiler()
130 { 130 {
131 } 131 }
132 132
133 void gl::buildShaders(
134 QOpenGLShaderProgram* shaderProgram,
135 const char* vertexShaderSource,
136 const char* fragmentShaderSource)
137 {
138 shaderProgram->create();
139 const bool vertexShaderCompiled = shaderProgram->addShaderFromSourceCode(QOpenGLShader::Vertex, vertexShaderSource);
140 QString log;
141 if (not vertexShaderCompiled)
142 {
143 log += "\n" + QObject::tr("Vertex shader:") + "\n" + shaderProgram->log();
144 }
145 const bool fragmentShaderCompiled = shaderProgram->addShaderFromSourceCode(QOpenGLShader::Fragment, fragmentShaderSource);
146 if (not fragmentShaderCompiled)
147 {
148 log += "\n" + QObject::tr("Fragment shader:") + "\n" + shaderProgram->log();
149 }
150 if (not vertexShaderCompiled or not fragmentShaderCompiled)
151 {
152 QMessageBox::critical(
153 nullptr,
154 QObject::tr("Shader compile error"),
155 QObject::tr("Could not compile shaders.") + "\n" + log);
156 std::exit(-1);
157 }
158 const bool linkSuccessful = shaderProgram->link();
159 if (not linkSuccessful)
160 {
161 QMessageBox::critical(
162 nullptr,
163 QObject::tr("Shader link error"),
164 QObject::tr("Could not link shaders: %1").arg(shaderProgram->log())
165 );
166 }
167 }
168
133 void gl::Compiler::initialize() 169 void gl::Compiler::initialize()
134 { 170 {
135 if (not this->initialized) 171 if (not this->initialized)
136 { 172 {
137 this->initializeOpenGLFunctions(); 173 this->initializeOpenGLFunctions();
138 for (int i = 0; i < gl::NUM_ARRAY_CLASSES; i += 1) 174 for (int i = 0; i < gl::NUM_ARRAY_CLASSES; i += 1)
139 { 175 {
140 auto& object = this->glObjects[i]; 176 auto& object = this->glObjects[i];
141 object.program = new QOpenGLShaderProgram; 177 object.program = new QOpenGLShaderProgram;
142 object.program->create(); 178 gl::buildShaders(object.program, ::vertexShaderSource, ::fragmentShaderSource);
143 const bool vertexShaderCompiled = object.program->addShaderFromSourceCode(QOpenGLShader::Vertex, ::vertexShaderSource);
144 QString log;
145 if (not vertexShaderCompiled)
146 {
147 log += "\n" + tr("Vertex shader:") + "\n" + object.program->log();
148 }
149 const bool fragmentShaderCompiled = object.program->addShaderFromSourceCode(QOpenGLShader::Fragment, ::fragmentShaderSource);
150 if (not fragmentShaderCompiled)
151 {
152 log += "\n" + tr("Fragment shader:") + "\n" + object.program->log();
153 }
154 if (not vertexShaderCompiled or not fragmentShaderCompiled)
155 {
156 QMessageBox::critical(nullptr, tr("Shader compile error"), tr("Could not compile shaders.") + "\n" + log);
157 std::exit(-1);
158 }
159 object.program->link();
160 object.program->bind(); 179 object.program->bind();
161 object.buffer.create(); 180 object.buffer.create();
162 object.buffer.bind(); 181 object.buffer.bind();
163 object.buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw); 182 object.buffer.setUsagePattern(QOpenGLBuffer::DynamicDraw);
164 object.vertexArray.create(); 183 object.vertexArray.create();

mercurial