/* * Load the vertex shader `vshader` and the fragment shader * `fshader`, compiles them and links them to the shader program. * Outputs warnings and compilation errors should an error occur. */ void GLWidgetContext::loadShaders(QString vstring, QString fstring, QOpenGLShader *vshader, QOpenGLShader *fshader, QOpenGLShaderProgram *prog) { QFileInfo vsh(vstring); if (vsh.exists()) { vshader = new QOpenGLShader(QOpenGLShader::Vertex); if (vshader->compileSourceFile(vstring)) { prog->addShader(vshader); } else { qWarning() << "Vertex shader error" << vshader->log(); } } else { qWarning() << "Vertex shader source file " << vstring << " not found."; } QFileInfo fsh(fstring); if (fsh.exists()) { fshader = new QOpenGLShader(QOpenGLShader::Fragment); if (fshader->compileSourceFile(fstring)) { prog->addShader(fshader); } else { qWarning() << "Fragment shader error" << fshader->log(); } } else { qWarning() << "Fragment shader source file " << fstring << " not found."; } prog->link(); }
void QGLRenderThread::LoadShader(QString vshader, QString fshader) { if(ShaderProgram) { ShaderProgram->release(); ShaderProgram->removeAllShaders(); } else ShaderProgram = new QGLShaderProgram; if(VertexShader) { delete VertexShader; VertexShader = NULL; } if(FragmentShader) { delete FragmentShader; FragmentShader = NULL; } // load and compile vertex shader QFileInfo vsh(vshader); if(vsh.exists()) { VertexShader = new QGLShader(QGLShader::Vertex); if(VertexShader->compileSourceFile(vshader)) { ShaderProgram->addShader(VertexShader); } else qWarning() << "Vertex Shader Error" << VertexShader->log(); } else qWarning() << "Vertex Shader source file " << vshader << " not found."; // load and compile fragment shader QFileInfo fsh(fshader); if(fsh.exists()) { FragmentShader = new QGLShader(QGLShader::Fragment); if(FragmentShader->compileSourceFile(fshader)) ShaderProgram->addShader(FragmentShader); else qWarning() << "Fragment Shader Error" << FragmentShader->log(); } else qWarning() << "Fragment Shader source file " << fshader << " not found."; if(!ShaderProgram->link()) { qWarning() << "Shader Program Linker Error" << ShaderProgram->log(); } else ShaderProgram->bind(); }
void GLWidgetContext::loadShaders(QString vstring, QString fstring, QString tcstring, QString testring, QOpenGLShader *vshader, QOpenGLShader *fshader, QOpenGLShader *tcshader, QOpenGLShader *teshader, QOpenGLShaderProgram *prog) { QFileInfo vsh(vstring); if (vsh.exists()) { vshader = new QOpenGLShader(QOpenGLShader::Vertex); if (vshader->compileSourceFile(vstring)) { prog->addShader(vshader); } else { qWarning() << "Vertex shader error" << vshader->log(); } } else { qWarning() << "Vertex shader source file " << vstring << " not found."; } QFileInfo fsh(fstring); if (fsh.exists()) { fshader = new QOpenGLShader(QOpenGLShader::Fragment); if (fshader->compileSourceFile(fstring)) { prog->addShader(fshader); } else { qWarning() << "Fragment shader error" << fshader->log(); } } else { qWarning() << "Fragment shader source file " << fstring << " not found."; } QFileInfo tcsh(tcstring); if (tcsh.exists()) { tcshader = new QOpenGLShader(QOpenGLShader::TessellationControl); if (tcshader->compileSourceFile(tcstring)) { prog->addShader(tcshader); } else { qWarning() << "Tessellation control shader error" << tcshader->log(); } } else { qWarning() << "Tesselation control source file " << tcstring << " not found."; } QFileInfo tesh(testring); if (tesh.exists()) { teshader = new QOpenGLShader(QOpenGLShader::TessellationEvaluation); if (teshader->compileSourceFile(testring)) { prog->addShader(teshader); } else { qWarning() << "Tessellation evaluation shader error" << teshader->log(); } } else { qWarning() << "Tesselation evaluation source file " << testring << " not found."; } prog->link(); }
void GLWidget::loadShaders(QGLShaderProgram* program, QString vShaderFileName, QString fShaderFileName) { QGLShader* vertexShader = NULL; QGLShader* fragmentShader = NULL; QFileInfo vsh(vShaderFileName); if(vsh.exists()) { vertexShader = new QGLShader(QGLShader::Vertex); if(vertexShader->compileSourceFile(vShaderFileName)) { program->addShader(vertexShader); qDebug() << "Vertex shader compiled successfully."; } else { qWarning() << "Vertex Shader Error" << vertexShader->log(); } } else { qWarning() << "Vertex Shader source file " << fShaderFileName << " not found."; } QFileInfo fsh(fShaderFileName); if(fsh.exists()) { fragmentShader = new QGLShader(QGLShader::Fragment); if(fragmentShader->compileSourceFile(fShaderFileName)) { program->addShader(fragmentShader); qDebug() << "Fragment shader compiled successfully."; } else { qWarning() << "Fragment Shader Error" << fragmentShader->log(); } } else { qWarning() << "Fragment Shader source file " << fShaderFileName << " not found."; } if(!program->link()){ qWarning() << "Shader Program Linker Error" << program->log(); } }
nuResource::ERROR_CODE nuShaderList::setup(const nuStream &stream) { if(stream.getSize() == 0) return ERROR_INVALID; nude::TempBuffer<> temp(stream.getSize()); if(!temp.getBuffer()) return ERROR_INSUFFICIENT_MEMORY; if(stream.read(temp.getBuffer(), temp.getSize()) != temp.getSize()) return ERROR_READ_FAIL; c8 shader_path[PATH_MAX]; c8* file_name = shader_path; const c8* p_curr = static_cast< c8* >(temp.getBuffer()); size_t remain = temp.getSize(); size_t path_cmd_len = strlen("SHADER_PATH"); bool end = false; for(ui32 ui = 0; ui < static_cast< ui32 >(temp.getSize()) && !end; ui++) { switch(p_curr[ui]) { case 0x0a: case 0x0d: case ' ': case '\t': break; case '#': do { ui++; remain--; } while(p_curr[ui] != 0x0a && p_curr[ui] != 0x0d); break; default: if(remain > path_cmd_len && strncmp(&p_curr[ui], "SHADER_PATH", path_cmd_len) == 0) { ui += path_cmd_len; remain -= path_cmd_len; c8* pc = shader_path; for(ui32 uj = ui; uj < static_cast< ui32 >(temp.getSize()) && !end; uj++) { switch(p_curr[uj]) { case ' ': case '\t': case '=': break; case '"': uj++; remain--; while(p_curr[uj] != '"' && remain > 0) { *pc = p_curr[uj]; pc++; uj++; remain--; } if(pc != shader_path && pc[-1] != '/') { *pc = '/'; pc++; } *pc = 0x00; NU_TRACE("Shader path: %s\n", shader_path); file_name = pc; end = true; break; default: return ERROR_INVALID; } remain--; } } else { return ERROR_INVALID; } } } size_t max_fname = PATH_MAX - strlen(shader_path); for(ui32 ui = 0; ui < nude::ProgramList_Num; ui++) { const nude::Program& prog = nude::GLSLPrograms[ui]; Data& data = mData[ui]; data.attribute = 0; if(prog.vsh_file) { snprintf(file_name, max_fname, "%s", prog.vsh_file); file_name[max_fname - 1] = 0x00; NU_TRACE("Reading VSH: %s\n", shader_path); nuFile vsh(nude::FATTR_READ, shader_path); if(vsh.isOpened()) { data.vsh_size = vsh.getSize(); data.vsh_data = nude::Alloc(data.vsh_size); vsh.read(data.vsh_data, data.vsh_size); } } else { data.vsh_data = nullptr; data.vsh_size = 0; } if(prog.fsh_file) { snprintf(file_name, max_fname, "%s", prog.fsh_file); file_name[max_fname - 1] = 0x00; NU_TRACE("Reading FSH: %s\n", shader_path); nuFile fsh(nude::FATTR_READ, shader_path); if(fsh.isOpened()) { data.fsh_size = fsh.getSize(); data.fsh_data = nude::Alloc(data.fsh_size); fsh.read(data.fsh_data, data.fsh_size); } } else { data.fsh_data = nullptr; data.fsh_size = 0; } } return ERROR_NONE; }