bool GLSL::initialize(const std::string& vertName, const std::string& fragName)
{
  std::ifstream fileVert(vertName.c_str());
  std::ifstream fileFrag(fragName.c_str());
  std::string sline;

  std::string sVertSource;
  std::string sFragSource;

  while(getline(fileVert, sline))
  {
	  sVertSource += sline+"\n";
  }

  while(getline(fileFrag, sline))
  {
	  sFragSource += sline+"\n";
  }

	mProgram = createProgram(sVertSource.c_str(), sFragSource.c_str());
	if (!mProgram)
    {
		Tools::getLogStream()<<"Could not create shader program."<<std::endl;
        mIsInit = false;
    }
	else
	{   
		initUniforms();
		mIsInit = true;
	}
	
	return mIsInit;
}
Exemple #2
0
bool App::OnInit() {
	_frame = new GLFrame( "Hello World", wxPoint(50, 50), wxSize(1024, 768) );
	_frame->Show( true );
	initShader("E:/Vault/glmanv2/vir.json");
	initUniforms();
	initModels();
	initTextures();
	ControlFrame* controlFrame = new ControlFrame();
	controlFrame->Show( true );
	_eventTimer = new wxTimer(this, kEventTimerId);
	_eventTimer->Start(1, wxTIMER_CONTINUOUS);
	return true;
}
Exemple #3
0
RendererDR::RendererDR(Engine* engine, ProgramLoader& loader)
	:
	mScreenSize(engine->getScreenSize()),
	mLights(engine->getLightSystem()),
	mTextures(engine->getTextureSystem()),
	mProgramMain(loader.getDefaultDR()),
	mProgramMainAnimated(loader.getDefaultBonesDR()),
	mProgramDirecionalLight(loader.getDRDirectionalLights()),
	mProgramSpotLight(loader.getDRSpotLights()),
	mProgramPointLight(loader.getDRPointLights()),
	mProgramDepthless(loader.getDRDepthless()),
	mProgramAmbient(loader.getDRAmbient()),
	mProgramAOGeometry(loader.getAmbientOcclusionGeometry()),
	mProgramAOColor(loader.getAmbientOcclusionColor()),
	mAOGeometryBuffer(engine->storeTextureRenderable()),
	mAOColorBuffer(engine->storeTextureRenderable()),
	mIsAO(GL_FALSE),
	mDeferredColorAttachments(5),
	mDeferredDepthAttachments(1),
	mGBuffer(
	  std::make_unique<core::FramebufferGeometry>(mTextures, mScreenSize[0],
	        mScreenSize[1], mDeferredColorAttachments,
	        mDeferredDepthAttachments)) {

	framework::Sphere sphere(3.0f, 10.0f,
	                         10.0f); // xxx hardcoded values fix ! todo !
	std::vector<core::VertexBasic> vertices = sphere.getVertices();
	std::vector<GLuint> indices = sphere.getIndices();

	core::VertexArray* vao = new core::VertexArray();
	mDeferredPointLight = std::make_unique<Mesh>(engine, Material(),
	                      nullptr,
	                      nullptr, nullptr,
	                      mProgramPointLight, nullptr, nullptr, loader.getOcclusionQuery(),
	                      nullptr, nullptr, mLights,
	                      engine->storeBuffer<core::VertexBufferBasic>(vao, vertices),
	                      engine->storeBuffer<core::IndexBuffer>(vao, indices),
#ifdef FILLWAVE_MODEL_LOADER_ASSIMP
	                      nullptr,
#endif /* FILLWAVE_MODEL_LOADER_ASSIMP */
	                      GL_TRIANGLES, vao);

	initUniforms();
	initGeometryBuffer();
	initGeometryShading();
	initUniformsCache();

	reset(mScreenSize[0], mScreenSize[1]);
}
Exemple #4
0
void Material::enable() {
  if (mShaderProgram != NULL && mShaderProgram->ready()) {
    mShaderProgram->enable();
    if (!mUniformsInitialized) {
      initUniforms();
    }
  } else {
    return;
  }
  
  for (unsigned int comp = 0; comp < MATERIAL_COMPONENT_COUNT; ++comp) {
    MaterialComponent &mat = mMaterialComponent[comp];
    if (mMaterialComponentEnabled[comp]) {
      // enable material component, if trigger uniform is defined //
      if (mat.uniformIsEnabled >= 0) {
        glUniform1i(mat.uniformIsEnabled, 1);
      }
      // link material value //
      glUniform4f(mat.uniformLocation, mat.value[0], mat.value[1], mat.value[2], mat.value[3]);
    } else {
      // disable material component, if trigger uniform is defined //
      if (mat.uniformIsEnabled >= 0) {
        glUniform1i(mat.uniformIsEnabled, 0);
      }
    }
  }
  
  for (unsigned int layer = 0; layer < TEX_LAYER_COUNT; ++layer) {
    if (mTexture[layer].isEnabled) {
      // enable texture, if trigger uniform defined //
      if (mTexture[layer].uniformIsEnabled >= 0) {
        glUniform1i(mTexture[layer].uniformIsEnabled, 1);
      }
      // link texture //
      glActiveTexture(GL_TEXTURE0 + layer);
      glBindTexture(GL_TEXTURE_2D, mTexture[layer].glTextureLocation);
      glUniform1i(mTexture[layer].uniformLocation, layer);
    } else {
      // disable texture, if trigger uniform defined  //
      if (mTexture[layer].uniformIsEnabled >= 0) {
        glUniform1i(mTexture[layer].uniformIsEnabled, 0);
      }
    }
  }
}
ParticleBasicMaterial::ParticleBasicMaterial() : Material(kParticleBasicMaterial)
{
    //  equivalent to three.js setMaterialShaders
    initUniforms(uniforms);
    vertexShader(ParticleBasicMaterial::kVertexShader);
    fragmentShader(ParticleBasicMaterial::kFragmentShader);

	color() = Color( 0xffffff );

	// map = null;

	size() = 1.0f;
	sizeAttenuation() = true;

	vertexColors() = false;

	fog() = true;
}
void TextureShader::programInit(RenderState* rstate, RenderData* render_data, Material* material,
        const std::vector<glm::mat4>& model_matrix,int drawcount, bool batching){

    if(!material->isMainTextureReady())
        return;

    Texture* texture = material->getTexture("main_texture");
    glm::vec3 color = material->getVec3("color");
    float opacity = material->getFloat("opacity");
    glm::vec4 material_ambient_color = material->getVec4("ambient_color");
    glm::vec4 material_diffuse_color = material->getVec4("diffuse_color");
    glm::vec4 material_specular_color = material->getVec4("specular_color");
    float material_specular_exponent = material->getFloat("specular_exponent");

    if (texture->getTarget() != GL_TEXTURE_2D) {
        std::string error = "TextureShader::render : texture with wrong target.";
        throw error;
    }

    bool use_light = false;
    Light* light;
    if (render_data->light_enabled()) {
        light = render_data->light();
        if (light->enabled()) {
            use_light = true;
        }
    }

    bool batching_enabled = batching;
    int feature_set =0;
    feature_set |= (use_light) ? LIGHT : NO_LIGHT;
    feature_set |= (use_multiview) ? MULTIVIEW : NO_MULTIVIEW;
    feature_set |= (batching_enabled) ? BATCHING : NO_BATCHING;

    bool properties [] = {use_light, use_multiview, batching_enabled};
    const char* feature_strings[2][3]={{NOT_USE_LIGHT, NOT_USE_MULTIVIEW, NOT_USE_BATCHING},
            {USE_LIGHT, USE_MULTIVIEW, USE_BATCHING}};

    int feature_string_lengths[2][3]={{strlen(NOT_USE_LIGHT), strlen(NOT_USE_MULTIVIEW), strlen(NOT_USE_BATCHING)},
            {strlen(USE_LIGHT),strlen(USE_MULTIVIEW), strlen(USE_BATCHING)}};

    uniforms uniform_locations;
    GLProgram* prgram = nullptr;
    if(program_object_map_.find(feature_set)==program_object_map_.end()){

        const char* vertex_shader_strings[5];
        GLint vertex_shader_string_lengths[5];
        vertex_shader_strings[0]=version;
        vertex_shader_strings[4]=VERTEX_SHADER;
        vertex_shader_string_lengths[0]= (GLint) strlen(version);
        vertex_shader_string_lengths[4]= (GLint) strlen(VERTEX_SHADER);

        const char* frag_shader_strings[5];
        GLint frag_shader_string_lengths[5];
        frag_shader_strings[0]=version;
        frag_shader_strings[4]=FRAGMENT_SHADER;
        frag_shader_string_lengths [0] = vertex_shader_string_lengths[0];
        frag_shader_string_lengths [4] = (GLint) strlen(FRAGMENT_SHADER);

        int index = 1;
        for(int i=0;i<3; i++){
            vertex_shader_strings[index]= feature_strings[properties[i]][i];
            vertex_shader_string_lengths [index]= feature_string_lengths[properties[i]][i];
            frag_shader_strings[index]=vertex_shader_strings[index];
            frag_shader_string_lengths[index] = vertex_shader_string_lengths [index];
            index++;
        }
        prgram = new GLProgram(vertex_shader_strings,
                vertex_shader_string_lengths, frag_shader_strings,
                frag_shader_string_lengths, 5);
        program_object_map_[feature_set] = prgram;

        if(use_multiview)
            LOGE("Rendering with multiview");
        initUniforms(feature_set, prgram->id(), uniform_locations);
        uniform_loc[feature_set] = uniform_locations;
    }
    else {
        prgram = program_object_map_[feature_set];
        uniform_locations = uniform_loc[feature_set];
    }

    program_ = prgram;
    GLuint programId = prgram->id();
    //render_data->mesh()->generateVAO(programId);
    GL(glUseProgram(programId));
    GL(glActiveTexture (GL_TEXTURE0));
    GL(glBindTexture(texture->getTarget(), texture->getId()));

    glUniform1i(uniform_locations.u_texture, 0);
    glUniform3f(uniform_locations.u_color, color.r, color.g, color.b);
    glUniform1f(uniform_locations.u_opacity, opacity);

    if(!batching_enabled)
        glUniformMatrix4fv(uniform_locations.u_model, 1, GL_FALSE, glm::value_ptr(rstate->uniforms.u_model));

    glUniformMatrix4fv(uniform_locations.u_proj, 1, GL_FALSE, glm::value_ptr(rstate->uniforms.u_proj));
    if (use_light) {
        glm::vec3 light_position = light->getVec3("world_position");
        glm::vec4 light_ambient_intensity = light->getVec4("ambient_intensity");
        glm::vec4 light_diffuse_intensity = light->getVec4("diffuse_intensity");
        glm::vec4 light_specular_intensity = light->getVec4(
                "specular_intensity");

        glUniform3f(uniform_locations.u_light_pos, light_position.x, light_position.y,
                light_position.z);

        glUniform4f(uniform_locations.u_material_ambient_color_, material_ambient_color.r,
                material_ambient_color.g, material_ambient_color.b,
                material_ambient_color.a);
        glUniform4f(uniform_locations.u_material_diffuse_color_, material_diffuse_color.r,
                material_diffuse_color.g, material_diffuse_color.b,
                material_diffuse_color.a);
        glUniform4f(uniform_locations.u_material_specular_color_, material_specular_color.r,
                material_specular_color.g, material_specular_color.b,
                material_specular_color.a);
        glUniform1f(uniform_locations.u_material_specular_exponent_, material_specular_exponent);
        glUniform4f(uniform_locations.u_light_ambient_intensity_, light_ambient_intensity.r,
                light_ambient_intensity.g, light_ambient_intensity.b,
                light_ambient_intensity.a);
        glUniform4f(uniform_locations.u_light_diffuse_intensity_, light_diffuse_intensity.r,
                light_diffuse_intensity.g, light_diffuse_intensity.b,
                light_diffuse_intensity.a);
        glUniform4f(uniform_locations.u_light_specular_intensity_, light_specular_intensity.r,
                light_specular_intensity.g, light_specular_intensity.b,
                light_specular_intensity.a);

    }

    if(use_multiview)
        glUniformMatrix4fv(uniform_locations.u_view, 2, GL_FALSE, glm::value_ptr(rstate->uniforms.u_view_[0]));
    else
        glUniformMatrix4fv(uniform_locations.u_view, 1, GL_FALSE, glm::value_ptr(rstate->uniforms.u_view));


    if(batching){
        glUniform4fv(uniform_locations.u_model, drawcount*4, &model_matrix[0][0][0]);
        glBindVertexArray(render_data->mesh()->getVAOId(programId));
    }


}
Exemple #7
0
Splatterer::Splatterer( const Logger*       logger,
                        const Context*      context,
                        GLfloat             viewportSize,
                        QString             textureFilename,
                        BufferTexture*      baseDiscomfort)
:   pointBuffer(0),
    screenSizedQuadBuffer(0),
    framebufferObject(0),
    densityDiscomfortVelocity(NULL),
    splatAreas(NULL),
    agent(NULL),
    splatAttribVertex(-1),
    splatProgram(NULL),
    splatVertexShader(NULL),
    splatGeometryShader(NULL),
    splatFragmentShader(NULL),
    camera(NULL),
    bufferSideLength(viewportSize),
    totalBufferSize(0),
    densityDiscomfortVelocityTripple(NULL),
    logger(logger),
    context(context),
    prepareFramebufferRenderer(NULL),
    discomfortProgram(NULL),
    discomfortVertexShader(NULL),
    discomfortGeometryShader(NULL),
    discomfortFragmentShader(NULL),
    discomfortFactor(NULL),
    discomfortRadius(NULL),
    discomfortPosition(NULL)
{
    attachments[0] = GL_COLOR_ATTACHMENT0;
    attachments[1] = GL_COLOR_ATTACHMENT1;

    initCamera();
    initSplatShaderProgram();
    initAttribs();
    initVBO();
    initUniforms();
    initFramebufferObject();

    try
    {
        //
        // Create splatted texture
        //

        QImage image = Texture::loadTexture(textureFilename, false, true);

        uint pixelCount = image.width() * image.height();

        std::vector<float> data(pixelCount * 4);

        Texture::convertToFloats(image, data, pixelCount);

        glActiveTexture(GL_TEXTURE0);

        agent = new Texture2D(image.width(), image.height(), GL_CLAMP_TO_EDGE, GL_LINEAR, GL_LINEAR, GL_RGBA32F, GL_RGBA, GL_FLOAT, &data[0]);
        totalBufferSize += image.width() * image.height() * 4 * 4;

    }
    catch (Exception& e)
    {
        throw Exception("Could not load splatting texture: " + e.message);
    }

    //
    // Create buffer object for density, discomfort and velocity
    //

    size_t bufferByteSize = bufferSideLength * bufferSideLength * sizeof(GLfloat) * 4;

    densityDiscomfortVelocityTripple = new TextureBufferTripple(bufferByteSize, NULL, GL_DYNAMIC_COPY, GL_RGBA32F, CL_MEM_READ_WRITE, context);
    totalBufferSize += bufferByteSize;

    //
    // Create renderer to render base discomfort map to framebuffer
    //

    std::vector<QString> filenamesVert;
    std::vector<QString> filenamesFrag;

    filenamesVert.push_back("src/shaders/shared.vert");
    filenamesFrag.push_back("src/shaders/shared.frag");
    filenamesFrag.push_back("src/shaders/prepareFramebuffer.frag");

    prepareFramebufferRenderer = new TextureRenderer(bufferSideLength, baseDiscomfort, filenamesVert, filenamesFrag, "Framebuffer Preparation Shader", false);

    //
    // Create shader to render discomfort at pointer to framebuffer
    //

    initDiscomfortShaderProgram();
}