void QGLFrame::openFileDialog() { QString filePath = QFileDialog::getOpenFileName(this,tr("Fragment Shader File"),"./../Shadertoy",tr("Files (*.fsh)")); qDebug()<<filePath; QFile fShaderFile(filePath); if(fShaderFile.open(QFile::ReadOnly | QFile::Text)) { this->code = fShaderFile.readAll(); stopRenderThread(); initRenderThread(); RenderThread.doRendering=true; emit sendCode(this->code); } else qDebug() <<"Error unable to open file:" << filePath; }
Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath) { // 1. Retrieve the vertex/fragment source code from filePath std::string vertexCode; std::string fragmentCode; try { // Open files std::ifstream vShaderFile(vertexPath); std::ifstream fShaderFile(fragmentPath); std::stringstream vShaderStream, fShaderStream; // Read file's buffer contents into streams vShaderStream << vShaderFile.rdbuf(); fShaderStream << fShaderFile.rdbuf(); // close file handlers vShaderFile.close(); fShaderFile.close(); // Convert stream into GLchar array vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); } catch(std::exception e) { std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; } // 2. Compile shaders GLint success; GLchar infoLog[512]; GLchar * vertexcodeCstr=(GLchar*)vertexCode.c_str(); GLchar * fragmentcodeCstr=(GLchar*)fragmentCode.c_str(); // Vertex Shader vertex = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex, 1, &vertexcodeCstr, NULL); glCompileShader(vertex); // Print compile errors if any glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); if(!success) { glGetShaderInfoLog(vertex, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; }; // Similiar for Fragment Shader fragment= glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment, 1, &fragmentcodeCstr, NULL); glCompileShader(fragment); // Check for compile time errors glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragment, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } this->Program = glCreateProgram(); glAttachShader(this->Program, vertex); glAttachShader(this->Program, fragment); glLinkProgram(this->Program); glGetProgramiv(this->Program, GL_LINK_STATUS, &success); if(!success) { glGetProgramInfoLog(this->Program, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } // Delete the shaders as they're linked into our program now and no longer necessery glDeleteShader(vertex); glDeleteShader(fragment); }
Shader::Shader(const GLchar *vertexSourcePath, const GLchar * fragmentSourcePath){ std::string vertexCode; std::string fragmentCode; try { std::ifstream vShaderFile(vertexSourcePath); std::ifstream fShaderFile(fragmentSourcePath); std::stringstream vShaderStream, fShaderStream; vShaderStream << vShaderFile.rdbuf(); fShaderStream << fShaderFile.rdbuf(); vShaderFile.close(); fShaderFile.close(); vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); } catch (std::exception e) { std::cout << "ERROR: READ SHADER FILE FAILED." << std::endl; } const GLchar *vShaderCode = vertexCode.c_str(); const GLchar *fShaderCode = fragmentCode.c_str(); GLuint vertex, fragment; GLint success; GLchar infoLog[512]; //¶¥µã×ÅÉ«Æ÷ vertex = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertex, 1, &vShaderCode, NULL); glCompileShader(vertex); glGetShaderiv(vertex, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertex, 512, NULL, infoLog); std::cout << "ERROR :SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } fragment = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragment, 1, &fShaderCode, NULL); glCompileShader(fragment); glGetShaderiv(fragment, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragment, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } this->Program = glCreateProgram(); glAttachShader(this->Program, vertex); glAttachShader(this->Program, fragment); glLinkProgram(this->Program); glGetProgramiv(this->Program, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(this->Program, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } glDeleteShader(vertex); glDeleteShader(fragment); }
void ShaderManipulator::createShader(std::string path, GLuint *shaderProgram){ std::string vertexCode; std::string fragmentCode; std::string tcsCode; std::string tesCode; try { // Open files std::ifstream vShaderFile("C:/martinka/libs/vertex.vs"); std::ifstream fShaderFile("C:/martinka/libs/fragment.fs"); std::ifstream tcsShaderFile("C:/martinka/libs/tesselation_shader.tcs"); std::ifstream tesShaderFile("C:/martinka/libs/tesselation_shader.tes"); std::stringstream vShaderStream, fShaderStream,tcsShaderStream,tesShaderStream; // Read file's buffer contents into streams vShaderStream << vShaderFile.rdbuf(); fShaderStream << fShaderFile.rdbuf(); tcsShaderStream << tcsShaderFile.rdbuf(); tesShaderStream << tesShaderFile.rdbuf(); // close file handlers vShaderFile.close(); fShaderFile.close(); tcsShaderFile.close(); tesShaderFile.close(); // Convert stream into GLchar array vertexCode = vShaderStream.str(); fragmentCode = fShaderStream.str(); tcsCode = tcsShaderStream.str(); tesCode = tesShaderStream.str(); } catch (std::exception e) { std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl; } const GLchar *vShaderCode = vertexCode.c_str(); const GLchar *fShaderCode = fragmentCode.c_str(); const GLchar *tcsShaderCode = tcsCode.c_str(); const GLchar *tesShaderCode = tesCode.c_str(); GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &vShaderCode, NULL); glCompileShader(vertexShader); // Check for compile time errors GLint success; GLchar infoLog[512]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(vertexShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } GLuint tcsShader = glCreateShader(GL_TESS_CONTROL_SHADER); glShaderSource(tcsShader, 1, &tcsShaderCode, NULL); glCompileShader(tcsShader); // Check for compile time errors glGetShaderiv(tcsShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(tcsShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl; } GLuint tesShader = glCreateShader(GL_TESS_EVALUATION_SHADER); glShaderSource(tesShader, 1, &tesShaderCode, NULL); glCompileShader(tesShader); // Check for compile time errors glGetShaderiv(tesShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(tesShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::TESS::EVALUATION::COMPILATION_FAILED\n" << infoLog << std::endl; } GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &fShaderCode, NULL); glCompileShader(fragmentShader); // Check for compile time errors glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { glGetShaderInfoLog(fragmentShader, 512, NULL, infoLog); std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl; } // Link shaders *shaderProgram = glCreateProgram(); glAttachShader(*shaderProgram, vertexShader); glAttachShader(*shaderProgram, tcsShader); glAttachShader(*shaderProgram, tesShader); glAttachShader(*shaderProgram, fragmentShader); glLinkProgram(*shaderProgram); // Check for linking errors glGetProgramiv(*shaderProgram, GL_LINK_STATUS, &success); if (!success) { glGetProgramInfoLog(*shaderProgram, 512, NULL, infoLog); std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl; } glDeleteShader(vertexShader); glDeleteShader(fragmentShader); glDeleteShader(tcsShader); glDeleteShader(tesShader); }