Shader::Shader(const char* vsFilePath, const char* fsFilePath) :m_vShaderFile(NULL), m_fShaderFile(NULL), m_vFileSize(0), m_fFileSize(0) { // 加载 vs if (_loadShader(vsFilePath, &m_vShaderFile, &m_vFileSize) != 0) return; const char* tmp = m_vShaderFile; // 编译 GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShader, 1, &tmp, NULL); glCompileShader(vertexShader); GLint success ; GLchar infoLog[1024]; glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success); if (!success) { //输出错误信息; glGetShaderInfoLog(vertexShader, 1024, NULL, infoLog); return; } //加载 if (_loadShader(fsFilePath, &m_fShaderFile, &m_fFileSize) != 0) return; tmp = m_fShaderFile; //fs obj GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShader, 1, &tmp, NULL); glCompileShader(fragmentShader); // 检查 fs 编译结果: glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success); if (!success) { //输出错误信息; glGetShaderInfoLog(fragmentShader, 1024, NULL, infoLog); return; } //生成 program objec 并且进行链接 m_shaderProgram = glCreateProgram(); glAttachShader(m_shaderProgram, vertexShader); glAttachShader(m_shaderProgram, fragmentShader); glLinkProgram(m_shaderProgram); glGetProgramiv(m_shaderProgram, GL_LINK_STATUS, &success); if (!success) { //输出错误信息; glGetProgramInfoLog(m_shaderProgram, 1024, NULL, infoLog); return; } //删除 vs,fs glDeleteShader(vertexShader); glDeleteShader(fragmentShader); }
bool GLSLShaders::loadShaders(const std::string &vShader, const std::string &fShader, const GLEWContext *glewContext) { if (_shadersLoaded) return true; LBASSERT(glewContext); _glewContext = glewContext; _program = glCreateProgramObjectARB(); GLhandleARB vertexShader = _loadShader(vShader, GL_VERTEX_SHADER_ARB); if (!vertexShader) return _cleanupOnError(); glAttachObjectARB(_program, vertexShader); GLhandleARB fragmentShader = _loadShader(fShader, GL_FRAGMENT_SHADER_ARB); if (!fragmentShader) return _cleanupOnError(vertexShader); glAttachObjectARB(_program, fragmentShader); glLinkProgramARB(_program); GLint status; glGetObjectParameterivARB(_program, GL_OBJECT_LINK_STATUS_ARB, &status); if (status != GL_FALSE) { _shadersLoaded = true; return true; } _printLog(_program, "Linking"); return _cleanupOnError(vertexShader, fragmentShader); }
bool CShaderMngr::LoadShader(const char *strFileName, GLenum nShaderType, const char *strName) { shaderData *sData = new shaderData; if (_loadShader(strFileName, sData) == 0) { if (_compileShader(sData, nShaderType)) { m_Shaders.push_back(std::pair<string, shaderData*>(string(strName), sData)); return true; } } return false; }