Пример #1
0
	bool ShaderLibrary::getMaterialShaders(string shader_list_name, Shader *&vertex_shader, Shader *&pixel_shader, bool no_light, bool no_gi, bool const_tex_coord) {
		ShaderList *shader_list=getShaderList(shader_list_name);
		if (shader_list) {
			ShaderSet *shader_set=shader_list->getShaderSet();
			
			if (shader_set) {
				// Pixel Shader
				string pixel_shader_name=shader_set->getPixelShaderName();
				if (no_light) pixel_shader_name += "_NoLight";
				if (no_gi) pixel_shader_name += "_NoGI";
				if (const_tex_coord) pixel_shader_name += "_ConstTexCoord";
				pixel_shader = getPixelShader(pixel_shader_name);

				// Vertex Shader
				string vertex_shader_name = shader_set->getVertexShaderName();

				if (const_tex_coord) vertex_shader_name += "_ConstTexCoord";

				if (vertex_shader_name.size()) {
					vertex_shader = getVertexShader(vertex_shader_name);
				}

				return true;
			}
		}

		return false;
	}
Пример #2
0
void MyView::addShaderProgram(SHADER_TYPE type, std::string vsFile, std::string fsFile){
	GLuint program, fs, vs;

	program = glCreateProgram();
	fs = getFragmentShader(fsFile);
	vs = getVertexShader(vsFile);

	glAttachShader(program, vs);
	glDeleteShader(vs);
	glAttachShader(program, fs);
	//for (int i = 0; i < fragmentOutputs.size(); i++){
	//	glBindFragDataLocation(program, i, fragmentOutputs[i].c_str());
	//}
	glDeleteShader(fs);
	glLinkProgram(program);

	//test program
	GLint link_status = 0;
	glGetProgramiv(program, GL_LINK_STATUS, &link_status);
	if (link_status != GL_TRUE) {
		const int string_length = 1024;
		GLchar log[string_length] = "";
		glGetProgramInfoLog(program, string_length, NULL, log);
		std::cerr << log << std::endl;
	}

	shaderPrograms_[type] = program;
}
Пример #3
0
    void GLSLProgram::setTransformFeedbackVaryings(const std::vector<String>& nameStrings)
    {
        // Get program object ID.
        GLuint programId;
        if (Root::getSingleton().getRenderSystem()->getCapabilities()->hasCapability(RSC_SEPARATE_SHADER_OBJECTS))
        {
            //TODO include tessellation stages
            GLSLShader* glslGpuProgram = getGeometryShader();
            if (!glslGpuProgram)
                glslGpuProgram = getVertexShader();

            programId = glslGpuProgram->getGLProgramHandle();

            // force re-link
            GpuProgramManager::getSingleton().removeMicrocodeFromCache(glslGpuProgram->_getHash());
            glslGpuProgram->setLinked(false);
        }
        else
        {
            programId = getGLProgramHandle();

            // force re-link
            GpuProgramManager::getSingleton().removeMicrocodeFromCache(getCombinedHash());
        }
        mLinked = false;

        // Convert to const char * for GL
        std::vector<const char*> names;
        for (uint e = 0; e < nameStrings.size(); e++)
        {
            names.push_back(nameStrings[e].c_str());
        }

        // TODO replace glTransformFeedbackVaryings with in-shader specification (GL 4.4)
        OGRE_CHECK_GL_ERROR(glTransformFeedbackVaryings(programId, nameStrings.size(), &names[0],
                                                        GL_INTERLEAVED_ATTRIBS));

#if OGRE_DEBUG_MODE
        activate();
        // Check if varyings were successfully set.
        GLchar Name[64];
        GLsizei Length(0);
        GLsizei Size(0);
        GLenum Type(0);
        // bool Validated = false;
        for (size_t i = 0; i < nameStrings.size(); i++)
        {
            OGRE_CHECK_GL_ERROR(
                glGetTransformFeedbackVarying(programId, i, 64, &Length, &Size, &Type, Name));
            LogManager::getSingleton().stream() << "Varying " << i << ": " << Name << " " << Length
                                                << " " << Size << " " << Type;
            // Validated = (Size == 1) && (Type == GL_FLOAT_VEC3);
            // std::cout << Validated << " " << GL_FLOAT_VEC3 << std::endl;
        }
#endif
    }
Пример #4
0
const unsigned int ShaderCache::getVertexShader(const tinyxml2::XMLElement* element, const DeviceManager& deviceManager)
{
    VertexShader shader;
    shader.deserialise(element);
    unsigned int resourceName = hashString(getResourceNameFromFileName(shader.getFileName()));
    if (getVertexShader(resourceName) == nullptr)
    {
        if (shader.createShader(deviceManager))
        {
            m_vertexShaders.emplace(VertexShaderHandle(resourceName, shader));
        }
    }
    
    return resourceName;
}
Пример #5
0
void MyView::
windowViewWillStart(std::shared_ptr<tygra::Window> window)
{
	assert(scene_ != nullptr);


	glEnable(GL_TEXTURE_2D);

	//shadow maps

	glGenTextures(1, &shadowMap_tex_);
	glBindTexture(GL_TEXTURE_2D_ARRAY, shadowMap_tex_);
	glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D_ARRAY, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GL_DEPTH_COMPONENT16, 1024, 1024, 5, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0); //the 256 is number of layers, change this to number of shadow casting lights

	glGenFramebuffers(1, &shadowMap_fbo_);
	glBindFramebuffer(GL_FRAMEBUFFER, shadowMap_fbo_);

	glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, shadowMap_tex_, 0);

	glDrawBuffer(GL_NONE); // No color buffer is drawn to.

	check_fbo();

	shadowMap_program_ = glCreateProgram();
	GLuint fs = getFragmentShader("shadowMap_fs.glsl");
	GLuint vs = getVertexShader("shadowMap_vs.glsl");

	glAttachShader(shadowMap_program_, vs);
	glDeleteShader(vs);
	glAttachShader(shadowMap_program_, fs);

	glDeleteShader(fs);
	glLinkProgram(shadowMap_program_);

	//test program
	GLint link_status = 0;
	glGetProgramiv(shadowMap_program_, GL_LINK_STATUS, &link_status);
	if (link_status != GL_TRUE) {
		const int string_length = 1024;
		GLchar log[string_length] = "";
		glGetProgramInfoLog(shadowMap_program_, string_length, NULL, log);
		std::cerr << log << std::endl;
	}


	//ssma textures

	glGenTextures(1, &albedo_tex);
	glBindTexture(GL_TEXTURE_2D, albedo_tex);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_FLOAT, 0);

	glGenTextures(1, &edge_tex);
	glBindTexture(GL_TEXTURE_2D, edge_tex);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_FLOAT, 0);

	glGenTextures(1, &blend_tex);
	glBindTexture(GL_TEXTURE_2D, blend_tex);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, SCREEN_WIDTH, SCREEN_HEIGHT, 0, GL_RGBA, GL_FLOAT, 0);

	unsigned char* buffer = 0;

	FILE* f = 0;

	buffer = new unsigned char[1024 * 1024];
	f = fopen((app_path + "smaa_area.raw").c_str(), "rb"); //rb stands for "read binary file"

	if (!f)
	{
		std::cerr << "Couldn't open smaa_area.raw.\n";
		exit(1);
	}

	fread(buffer, AREATEX_WIDTH * AREATEX_HEIGHT * 2, 1, f);
	fclose(f);

	f = 0;


	glGenTextures(1, &area_tex);
	glBindTexture(GL_TEXTURE_2D, area_tex);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RG8, (GLsizei)AREATEX_WIDTH, (GLsizei)AREATEX_HEIGHT, 0, GL_RG, GL_UNSIGNED_BYTE, buffer);

	f = fopen((app_path + "smaa_search.raw").c_str(), "rb");

	if (!f)
	{
		std::cerr << "Couldn't open smaa_search.raw.\n";
		exit(1);
	}

	fread(buffer, SEARCHTEX_WIDTH * SEARCHTEX_HEIGHT, 1, f);
	fclose(f);

	f = 0;

	glGenTextures(1, &search_tex);
	glBindTexture(GL_TEXTURE_2D, search_tex);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_R8, (GLsizei)SEARCHTEX_WIDTH, (GLsizei)SEARCHTEX_HEIGHT, 0, GL_RED, GL_UNSIGNED_BYTE, buffer);


	delete[] buffer;

	get_opengl_error();


	/*
	* Initialize FBOs
	*/

	GLenum modes[] = { GL_COLOR_ATTACHMENT0 };

	glGenFramebuffers(1, &albedo_fbo);
	glBindFramebuffer(GL_FRAMEBUFFER, albedo_fbo);
	glDrawBuffers(1, modes);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, albedo_tex, 0);

	check_fbo();

	glGenFramebuffers(1, &edge_fbo);
	glBindFramebuffer(GL_FRAMEBUFFER, edge_fbo);
	glDrawBuffers(1, modes);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, edge_tex, 0);

	check_fbo();

	glGenFramebuffers(1, &blend_fbo);
	glBindFramebuffer(GL_FRAMEBUFFER, blend_fbo);
	glDrawBuffers(1, modes);
	glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, blend_tex, 0);

	check_fbo();

	glBindFramebuffer(GL_FRAMEBUFFER, 0);

	glBindTexture(GL_TEXTURE_2D, 0);

	get_opengl_error();



	/*
	* Set up shaders
	*/

	/*
	* EDGE SHADER
	*/

	create_shader(&edge_vs, &edge_ps, &edge_shader);

	//SET UNIFORMS
	glUseProgram(edge_shader);
	glUniform1i(glGetUniformLocation(edge_shader, "albedo_tex"), 0);
	glUseProgram(0);

	//VALIDATE
	validate_program(edge_shader);

	get_opengl_error();

	/*
	* BLEND SHADER
	*/

	create_shader(&blend_vs, &blend_ps, &blend_shader);

	//SET UNIFORMS
	glUseProgram(blend_shader);
	glUniform1i(glGetUniformLocation(blend_shader, "edge_tex"), 0);
	glUniform1i(glGetUniformLocation(blend_shader, "area_tex"), 1);
	glUniform1i(glGetUniformLocation(blend_shader, "search_tex"), 2);
	glUseProgram(0);

	//VALIDATE
	validate_program(blend_shader);

	get_opengl_error();

	/*
	* NEIGHBORHOOD SHADER
	*/

	create_shader(&neighborhood_vs, &neighborhood_ps, &neighborhood_shader);

	//SET UNIFORMS
	glUseProgram(neighborhood_shader);
	glUniform1i(glGetUniformLocation(neighborhood_shader, "albedo_tex"), 0);
	glUniform1i(glGetUniformLocation(neighborhood_shader, "blend_tex"), 1);
	glUseProgram(0);

	//VALIDATE
	validate_program(neighborhood_shader);

	get_opengl_error();





	//anything that is done once on load goes here

	materialCount_ = scene_->getAllMaterials().size();
	spotLightCount_ = scene_->getAllSpotLights().size();
	pointLightCount_ = scene_->getAllPointLights().size();
	directionalLightCount_ = scene_->getAllDirectionalLights().size();

	loadShaders();
	loadMeshes();
	loadUniformBuffers();

	glEnable(GL_CULL_FACE);
	glClearColor(0.f, 0.f, 0.25f, 0.f);

	//GBUFER TEXTURES
	glGenTextures(1, &gbuffer_position_tex_);
	glGenTextures(1, &gbuffer_normal_tex_);
	glGenTextures(1, &gbuffer_matColour_tex_);

	glGenFramebuffers(1, &lbuffer_fbo_);
	glGenRenderbuffers(1, &lbuffer_colour_rbo_);

	glGenFramebuffers(1, &gbuffer_fbo_);
	glGenRenderbuffers(1, &gbuffer_depth_rbo_);

	//only need to set this once
	glUseProgram(shaderPrograms_[AMBIENT_LIGHT]);
	GLuint ambient = glGetUniformLocation(shaderPrograms_[AMBIENT_LIGHT], "ambientLight");
	glUniform3fv(ambient, 1, glm::value_ptr(scene_->getAmbientLightIntensity()));
}