Пример #1
0
ShaderObject *ShaderManager::getShaderObject(const Common::UString &name, const Common::UString &source, ShaderType type) {
	_shaderMutex.lock();
	ShaderObject *shaderObject = 0;
	//ShaderObject *shaderObject = (ShaderObject *)(_shaderObjectMap[filename.c_str()]);
	std::map<Common::UString, Shader::ShaderObject *>::iterator it = _shaderObjectMap.find(name);
	if (it != _shaderObjectMap.end()) {
		_shaderMutex.unlock();
		return it->second;
	}

	shaderObject = new ShaderObject;
	shaderObject->type = type;
	shaderObject->glid = 0;
	shaderObject->shaderString = source;

	status("shader %s loaded", name.c_str());

	_shaderObjectMap.insert(std::pair<Common::UString, ShaderObject *>(name, shaderObject));
	_shaderMutex.unlock();

	parseShaderVariables(source, shaderObject->variablesSelf);
	genShaderVariableList(shaderObject, shaderObject->variablesCombined);
	if (shaderObject->type == SHADER_VERTEX) {
		shaderObject->id = _counterVID++; // Post decrement intentional.
	} else {
		shaderObject->id = _counterFID++; // Post decrement intentional.
	}

	return shaderObject;
}
Пример #2
0
ShaderObject *ShaderManager::getShaderObject(const Common::UString &name, const Common::UString &source, ShaderType type) {
	ShaderObject *shaderObject = 0;
	//ShaderObject *shaderObject = (ShaderObject *)(_shaderObjectMap[filename.c_str()]);
	std::map<Common::UString, Shader::ShaderObject *>::iterator it = _shaderObjectMap.find(name);
	if (it != _shaderObjectMap.end()) {
		return it->second;
	}

	shaderObject = new ShaderObject;
	shaderObject->type = type;
	shaderObject->glid = glCreateShader(shaderObject->type == SHADER_VERTEX ? GL_VERTEX_SHADER : GL_FRAGMENT_SHADER);
	const char *text = source.c_str();
	glShaderSource(shaderObject->glid, 1, (const GLchar **)(&text), 0);
	glCompileShader(shaderObject->glid);

	status("shader %s loaded", name.c_str());

	GLint gl_status;
	glGetShaderiv(shaderObject->glid, GL_COMPILE_STATUS, &gl_status);
	if (gl_status == GL_FALSE) {
		GLsizei logolength;
		char logorama[4096];
		glGetShaderInfoLog(shaderObject->glid, 4095, &logolength, logorama);
		error("shader compile failure! shader %s, Driver output:\n", logorama);
		delete shaderObject;
	} else {
		_shaderObjectMap.insert(std::pair<Common::UString, ShaderObject *>(name, shaderObject));
		parseShaderVariables(source, shaderObject->variablesSelf);
		genShaderVariableList(shaderObject, shaderObject->variablesCombined);
		if (shaderObject->type == SHADER_VERTEX) {
			shaderObject->id = _counterVID++; // Post decrement intentional.
		} else {
			shaderObject->id = _counterFID++; // Post decrement intentional.
		}
	}

	return shaderObject;
}