Пример #1
0
void FrameBufferObject::debugMode(Light &light, Node& mainNode, const glm::mat4& projection, int x, int y, int width, int height, Shader& shader) {
    glCullFace(GL_FRONT);

    glm::mat4 view;
    glm::vec4 lightPos4 = light.getPosition();
    glm::vec3 lightPos3(lightPos4.x,lightPos4.y,lightPos4.z);

    glUseProgram(shader.getProgramID());

    glUniform4fv(glGetUniformLocation(shader.getProgramID(), "pointLightPos"),
                LightManager::get().getPointLightCount(),
                LightManager::get().getPointLightsPos());
    glUniform4fv(glGetUniformLocation(shader.getProgramID(), "pointLightProp"),
                LightManager::get().getPointLightCount(),
                LightManager::get().getPointLightsProp());
    glUniform1i(glGetUniformLocation(shader.getProgramID(), "pointLightCount"),
                LightManager::get().getPointLightCount());

    glUniformMatrix4fv(glGetUniformLocation(shader.getProgramID(), "projection"), 1, GL_FALSE, glm::value_ptr(projection));

    // Clear screen
    glClearColor(FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX);

    for (size_t i = 0 ; i < CameraDirection::NUM_OF_LAYERS ; ++i) {
        glViewport(x+width*(i%3),y+height*(i/3),width,height);
        //glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

        view = glm::lookAt(lightPos3, lightPos3+cameraDirection[i].Target, cameraDirection[i].Up);

        glUniformMatrix4fv(glGetUniformLocation(shader.getProgramID(), "view"), 1, GL_FALSE, glm::value_ptr(view));

        mainNode.draw(view, glm::mat4(1), projection, shader);
    }
}
Пример #2
0
void FrameBufferObject::shadowPass(size_t textureId_p, Light &light, Node& mainNode, const glm::mat4& projection) {
    glCullFace(GL_FRONT);

    glm::mat4 view;
    glm::vec4 lightPos4 = light.getPosition();
    glm::vec3 lightPos3(lightPos4.x,lightPos4.y,lightPos4.z);

    glUseProgram(m_shadowMapShader->getProgramID());

    glUniform3f(glGetUniformLocation(m_shadowMapShader->getProgramID(), "lightPos"), lightPos4.x,lightPos4.y,lightPos4.z);

    glViewport(0,0,m_textureSize,m_textureSize);

    // Clear screen
    glClearColor(FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX);

    for (size_t i = 0 ; i < CameraDirection::NUM_OF_LAYERS ; ++i) {
        bindForWriting(textureId_p, cameraDirection[i].CubemapFace);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        view = glm::lookAt(lightPos3, lightPos3+cameraDirection[i].Target, cameraDirection[i].Up);

        mainNode.draw(view, glm::mat4(1), projection, *m_shadowMapShader);
    }
}
void ShaderSpecularContour::findTangent(const unsigned int i)
{
	gmVector3 myV = *(view->getCameraPosition());

	gmVector3 ni, posi; //particle normal and position

	posi = position->getPosition(i);
	ni = impInt->grad(i);

	gmVector4 lightPos4;
	light->getLightPosition(lightPos4);
	gmVector3 lightPos3(lightPos4[0],lightPos4[1],lightPos4[2]);	
		
	gmVector3 s = myV.normalize() + lightPos3.normalize();
	
	double niLength = ni.length();
		
	double sLength = s.length(); 
		
	gmMatrix3 Hess = impInt->hess(i);
													  
	gmVector3 specularNormal;	

	specularNormal = (Hess * s) - shine *( sLength * (1/niLength) *( Hess * ni));	

	gmVector3 tangent = -1 * cross(ni,specularNormal);

	if(tangent.lengthSquared() > gmEPSILON) tangent.normalize();
	
	tangentAttr->setVector(i,tangent);
	
}
void ManagerLight::init()
{
	// point lights
	float dif[4] = { 0.7f, 0.7f, 0.3f, 1.0f };
	Vector diff(dif, 4);
	float specPointf[4] = { 0.1f, 0.1f, 0.1f, 1.0f };
	Vector specPoint(specPointf, 4);
	float lpos1[4] = { 0.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos1(lpos1, 4);
	Light *light1 = new Light(0, Light::POINT_LIGHT, game);
	light1->setPosition(lightPos1);
	light1->setDiffuse(diff);
	light1->setAmbient(diff);
	light1->setSpecular(specPoint);
	lights.push_back(light1);

	float lpos2[4] = { 10.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos2(lpos2, 4);
	Light *light2 = new Light(1, Light::POINT_LIGHT, game);
	light2->setPosition(lightPos2);
	light2->setDiffuse(diff);
	light2->setAmbient(diff);
	light2->setSpecular(specPoint);
	lights.push_back(light2);

	float lpos3[4] = { -10.0f, -1.0f, 0.5f, 1.0f };
	Vector lightPos3(lpos3, 4);
	Light *light3 = new Light(2, Light::POINT_LIGHT, game);
	light3->setPosition(lightPos3);
	light3->setDiffuse(diff);
	light3->setAmbient(diff);
	light3->setSpecular(specPoint);
	lights.push_back(light3);

	float lpos4[4] = { 0.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos4(lpos4, 4);
	Light *light4 = new Light(3, Light::POINT_LIGHT, game);
	light4->setPosition(lightPos4);
	light4->setDiffuse(diff);
	light4->setAmbient(diff);
	light4->setSpecular(specPoint);
	lights.push_back(light4);

	float lpos5[4] = { 10.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos5(lpos5, 4);
	Light *light5 = new Light(4, Light::POINT_LIGHT, game);
	light5->setPosition(lightPos5);
	light5->setDiffuse(diff);
	light5->setAmbient(diff);
	light5->setSpecular(specPoint);
	lights.push_back(light5);

	float lpos6[4] = { -10.0f, -13.0f, 0.5f, 1.0f };
	Vector lightPos6(lpos6, 4);
	Light *light6 = new Light(5, Light::POINT_LIGHT, game);
	light6->setPosition(lightPos6);
	light6->setDiffuse(diff);
	light6->setAmbient(diff);
	light6->setSpecular(specPoint);
	lights.push_back(light6);

	// directional light
	float difDirf[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	Vector diffDir(difDirf, 4);
	float ldir[4] = { -1.0f, -1.0f, -1.0f, 0.0f };
	Vector lightDir(ldir, 4);
	Light *dirLight = new Light(6, Light::DIR_LIGHT, game);
	dirLight->setDiffuse(diffDir);
	dirLight->setAmbient(diffDir);
	dirLight->setSpecular(diffDir);
	dirLight->setPosition(lightDir);
	this->dirLight = dirLight;
	lights.push_back(dirLight);

	// spot light
	float difSpotf[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
	Vector difSpot(difSpotf, 4);
	float lSpotPosf[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
	Vector lSpotPos(lSpotPosf, 4);
	float lSpotDirf[3] = { 0.0f, 0.0f, -1.0f };
	Vector lSpotDir(lSpotDirf, 3);
	Light *spot = new Light(7, Light::SPOT_LIGHT, game);
	spot->setDiffuse(difSpot);
	spot->setAmbient(difSpot);
	spot->setSpecular(difSpot);
	spot->setPosition(lSpotPos);
	spot->setDirection(lSpotDir);
	spot->setCutoff(0.5f);
	spot->setExponent(0.1f);
	spotLight = spot;
	lights.push_back(spot);
}