gfx::ShaderProgramHandle gfx::ShaderBank::LoadShaderProgramFromShaders ( const std::vector< Shader* >& shaders ) { ShaderProgram* program = new ShaderProgram(); program->Init(shaders, true); ShaderProgramHandle handle = m_Counter++; m_Programs.push_back(program); m_HandleToPrograms.emplace(handle, program); return handle; }
void SORA_test_draw2(int w, int h) { static bool init = false; static ShaderProgram shader; static TextureManager tex_mgr; if(init == false) { init = true; //create shader //2d shader std::string app_vert_path = sora::Filesystem::GetAppPath("shader/simple.vs"); std::string app_frag_path = sora::Filesystem::GetAppPath("shader/simple.fs"); sora::MemoryFile vert_file(app_vert_path); sora::MemoryFile frag_file(app_frag_path); vert_file.Open(); frag_file.Open(); const char *vert_src = (const char*)(vert_file.start); const char *frag_src = (const char*)(frag_file.start); bool prog_result = shader.Init(vert_src, frag_src); if(prog_result == false) { LOGE("Could not create program."); } { std::string tex_path = sora::Filesystem::GetAppPath("texture/sora.png"); sora::MemoryFile tex_file(tex_path); tex_file.Open(); Texture tex("sora"); tex.SetData(sora::Texture::kFilePNG, tex_file.start, tex_file.end); tex_mgr.Add(tex); } } static float a = 0; a += 0.1f; glClearColor(0.1f, 0.1f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT); glViewport(0, 0, w, h); SR_CHECK_ERROR("Render 2d start"); //draw 2d something glm::mat4 world_mat(1.0f); int pos_loc = shader.GetAttribLocation("a_position"); int tex_loc = shader.GetAttribLocation("a_texcoord"); glEnableVertexAttribArray(pos_loc); glEnableVertexAttribArray(tex_loc); int mvp_loc = shader.GetUniformLocation("u_worldViewProjection"); float vertex[] = { -0.5, -0.5, 0, 0.5, -0.5, 0, 0, 0.5, 0, }; float texcoord[] = { 0, 0, 1, 0, 0.5, 1, }; glUseProgram(shader.prog); Texture *tex = tex_mgr.Get_ptr(string("sora")); glBindTexture(GL_TEXTURE_2D, tex->handle()); glUniformMatrix4fv(mvp_loc, 1, GL_FALSE, glm::value_ptr(world_mat)); glVertexAttribPointer(pos_loc, 3, GL_FLOAT, GL_FALSE, 0, vertex); glVertexAttribPointer(tex_loc, 2, GL_FLOAT, GL_FALSE, 0, texcoord); glDrawArrays(GL_TRIANGLE_FAN, 0, 3); SR_CHECK_ERROR("glDrawArrays"); }