Shader& GenShader(std::string a_dir, ShaderID a_ID) { Shader* shader = new Shader(); shader->Load(a_dir, a_ID); return *shader; }
bool SProgram::AttachShader(const char* a_directory, ShaderID a_type) { Shader* shader = new Shader(); if (!shader->Load(a_directory, a_type)) return false; shader->AttachToProgram(m_programID); switch (a_type) { case ShaderID::VERT_SHADER: m_vertShader = shader; break; case ShaderID::FRAG_SHADER: m_fragShader = shader; break; case ShaderID::GEOM_SHADER: m_geomShader = shader; break; case ShaderID::TESSC_SHADER: m_tessCShader = shader; break; case ShaderID::TESSE_SHADER: m_tessEShader = shader; break; case ShaderID::DEFAULT: return false; default: return false; } return true; }
//------------------------------------------------------------------------------ void GL::Program::AttachShader(const char* filename, GLenum type) { if (compiled_) { ERROR_WARNING("Program is already compiled."); return; } Shader* shader = new Shader(); shader->Load(filename, type); // check if a shader was already attached switch (type) { case GL_VERTEX_SHADER: if (vertexShader_) { glDetachShader(program_, *vertexShader_); delete vertexShader_; ERROR_WARNING("Vertex shader was replaced.") } vertexShader_ = shader; break; case GL_FRAGMENT_SHADER: if (fragmentShader_) { glDetachShader(program_, *fragmentShader_); delete fragmentShader_; ERROR_WARNING("Vertex shader was replaced.") } fragmentShader_ = shader; break; } glAttachShader(program_, *shader); }
MaterialCompiler::eCompileResult MaterialCompiler::Compile(MaterialGraph * _materialGraph, PolygonGroup * _polygonGroup, uint32 maxLights, NMaterial ** resultMaterial) { materialGraph = _materialGraph; polygonGroup = _polygonGroup; MaterialGraphNode * rootResultNode = materialGraph->GetNodeByName("material"); if (!rootResultNode) { return COMPILATION_FAILED; } currentMaterial = new NMaterial(maxLights); RecursiveSetDepthMarker(rootResultNode, 0); materialGraph->SortByDepthMarkerAndRemoveUnused(); MaterialGraphNode::RecursiveSetRealUsageBack(rootResultNode); MaterialGraphNode::RecursiveSetRealUsageForward(rootResultNode); materialCompiledVshName = FilePath::CreateWithNewExtension(materialGraph->GetMaterialPathname(), ".vsh"); materialCompiledFshName = FilePath::CreateWithNewExtension(materialGraph->GetMaterialPathname(), ".fsh"); #if 1 materialCompiledVshName = "~doc:/temp.vsh"; materialCompiledFshName = "~doc:/temp.fsh"; #endif GenerateCode(materialGraph); Shader * shader = new Shader(); shader->Load(materialCompiledVshName, materialCompiledFshName); shader->RecompileAsync(); currentMaterial->SetShader(0, shader); *resultMaterial = currentMaterial; return COMPILATION_SUCCESS; };
int main() { Game game(800, 600, "Hello World", false); Shader shader; shader.Load("./res/shader"); Mesh mesh; /*const GLfloat vertices[] = { -0.5f, 0.5f, 1.0f, 1.0f, 0.0f, 0.0f, // Top-left 0.5f, 0.5f, 1.0f, 0.0f, 1.0f, 0.0f, // Top-right 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, // Bottom-right -0.5f, -0.5f, 1.0f, 1.0f, 1.0f, 1.0f // Bottom-left };*/ Vertex vertices[] = { Vertex(glm::vec3(-0.5, 0.5, 1.0), glm::vec3(0.0, 1.0, 0.0)), Vertex(glm::vec3(0.5, 0.5, 1.0), glm::vec3(1.0, 1.0, 0.0)), Vertex(glm::vec3(0.5, -0.5, 1.0), glm::vec3(0.0, 0.0, 1.0)), Vertex(glm::vec3(-0.5, -0.5, 1.0), glm::vec3(0.0, 0.0, 0.0)), }; ///setup element array buffer GLuint elements[] = { 0, 1, 2, 2, 3, 0, }; GLuint ebo; glGenBuffers(1, &ebo); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW); cout << "Shader programID is: " << shader.GetProgramID() << endl; mesh.Init(&vertices[0], 4, shader.GetProgramID()); GLenum errCode; const GLubyte* errString; errCode = glGetError(); if (errCode != GL_NO_ERROR) { cout << "GL error code: " << errCode << endl; ofstream ofs; ofs.open("glerror.txt"); ofs << errCode << endl; ofs.close(); } if(glIsProgram(shader.GetProgramID()) == GL_FALSE) { cout << "The program with id " << shader.GetProgramID() << " does not exist." << endl; } else { cout << "Shader with program id " << shader.GetProgramID() << " has been created." << endl; } float counter = 0.0f; while(!game.isClosed) { game.PollInput(); game.GetWindow()->r = sinf(counter); game.GetWindow()->g = cosf(counter); game.GetWindow()->b = cosf(counter); game.Update(); counter += 0.01f; if(counter >= 360.0f) { counter = 0.0f; } } glDeleteShader(shader.GetProgramID()); game.Quit(); return 0; }