#include //#include #include #include #include namespace hgl { namespace graph { namespace { constexpr uint OpenGLShaderType[ShaderType::stEnd]= { GL_VERTEX_SHADER, ///<顶点着色程序 GL_TESS_CONTROL_SHADER, ///<镶嵌控制着色程序(需OpenGL 4.0或ARB_tessellation_shader) GL_TESS_EVALUATION_SHADER, ///<镶嵌评估着色程序(需OpenGL 4.0或ARB_tessellation_shader) GL_GEOMETRY_SHADER, ///<几何着色程序 GL_FRAGMENT_SHADER, ///<片断着色程序 GL_COMPUTE_SHADER ///<计算着色程序(需OpenGL 4.3或ARB_compute_shader) }; } const char ShaderTypeName[ShaderType::stEnd][32]= { "Vertex", "TessControl", "TessEvaluation", "Geometry", "Fragment", "Compute" }; namespace { /** * 编译一段shader * @param type 类型 * @param name 名称 * @param shader_source 代码 * @return 编译成功的shader句柄 * @return 0 编译失败 */ GLuint CompileShader(GLenum type,const char *name,const char *shader_source) { if(!shader_source)return(0); GLuint shader=glCreateShader(type); glShaderSource(shader,1,&shader_source,0); glCompileShader(shader); GLint compiled,log_length; glGetShaderiv(shader,GL_COMPILE_STATUS,&compiled); if(compiled) return(shader); glGetShaderiv(shader,GL_INFO_LOG_LENGTH,&log_length); GLint char_writen; char *log=new char[log_length]; glGetShaderInfoLog(shader,log_length,&char_writen,log); // LOG_HINT(UTF8String(name)+U8_TEXT(" shader compile error\n\n")+ UTF8String(log)); delete[] log; //LOG_ERROR(shader_source); glDeleteShader(shader); return(0); } }//namespace void Shader::Clear() { for(int i=0;i=ShaderType::stEnd)return(false); if(shader_index[shader_type])return(false); if(!shader_codes ||!(*shader_codes))return(false); shader_index[shader_type]=CompileShader(OpenGLShaderType[shader_type],ShaderTypeName[shader_type],shader_codes); if(!shader_index[shader_type]) return(false); return(true); } bool Shader::Build() { program=glCreateProgram(); for(int i=0;i