bool ParticleSystem::checkProgram(std::string pathName, std::string vertexPath, std::string fragPath){ GLuint shaderProg, vertexShader, fragmentShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); const GLchar* adapter[1]; std::string temp = readShaderCode((pathName + vertexPath).c_str()); adapter[0] = temp.c_str(); glShaderSource(vertexShader, 1, adapter, 0); temp = readShaderCode((pathName + fragPath).c_str()); adapter[0] = temp.c_str(); glShaderSource(fragmentShader, 1, adapter, 0); glCompileShader(vertexShader); glCompileShader(fragmentShader); if(!checkShaderStatus(vertexShader) || !checkShaderStatus(fragmentShader)) return false; shaderProg = glCreateProgram(); glAttachShader(shaderProg, vertexShader); glAttachShader(shaderProg, fragmentShader); glLinkProgram(shaderProg); if(!checkPogramStatus(shaderProg)) return false; return true; }
void BasicTexturedShader::installShader(){ vertexShaderID = glCreateShader(GL_VERTEX_SHADER); fragmentShaderID = glCreateShader(GL_FRAGMENT_SHADER); const GLchar* adapter[1]; std::string temp = readShaderCode("src/Engine/Shader/GLSL/BasicTexturedShaderVertexShader.glsl").c_str(); adapter[0] = temp.c_str(); glShaderSource(vertexShaderID, 1, adapter, 0); temp = readShaderCode("src/Engine/Shader/GLSL/BasicTexturedShaderFragmentShader.glsl").c_str(); adapter[0] = temp.c_str(); glShaderSource(fragmentShaderID, 1, adapter, 0); glCompileShader(vertexShaderID); glCompileShader(fragmentShaderID); if (!checkShaderStatus(vertexShaderID) | !checkShaderStatus(fragmentShaderID)){ return; } programID = glCreateProgram(); glAttachShader(programID, vertexShaderID); glAttachShader(programID, fragmentShaderID); glLinkProgram(programID); glValidateProgram(programID); if (!checkProgramStatus(programID)){ return; } getAllUniformLocations(); }
ShaderData::ShaderData(const std::string& vertexShader, const std::string& fragmentShader) { m_programID = glCreateProgram(); std::string vertexShaderCode = readShaderCode(vertexShader); GLuint vertexShaderID = addShaderToProgram(vertexShaderCode, GL_VERTEX_SHADER); std::string fragmentShaderCode = readShaderCode(fragmentShader); GLuint fragmentShaderID = addShaderToProgram(fragmentShaderCode, GL_FRAGMENT_SHADER); linkProgram(); glDeleteShader(vertexShaderID); glDeleteShader(fragmentShaderID); }
void ParticleSystem::createTransformProgram(std::string pathName){ std::string vertexPath = std::string("/resources/transform.vert"); // shaderTransform.CreateProgramFromFile(vsTransform.c_str()); GLuint vertexShader; vertexShader = glCreateShader(GL_VERTEX_SHADER); const GLchar* adapter[1]; std::string temp = readShaderCode((pathName + vertexPath).c_str()); adapter[0] = temp.c_str(); glShaderSource(vertexShader, 1, adapter, 0); glCompileShader(vertexShader); if(!checkShaderStatus(vertexShader)){ std::cout.flush(); std::cout << "******** shader error ********" <<std::endl; exit(0); } program_transform = glCreateProgram(); glProgramParameteri(program_transform, GL_PROGRAM_SEPARABLE, GL_TRUE); glAttachShader(program_transform, vertexShader); //feedback transform const GLchar* feedbackVaryings[] = { "Position"}; glTransformFeedbackVaryings(program_transform, 1, feedbackVaryings, GL_INTERLEAVED_ATTRIBS); glLinkProgram(program_transform); if(!checkPogramStatus(program_transform)){ std::cout.flush(); std::cout << "******** shader error ********" <<std::endl; exit(0); } return true; }