Exemplo n.º 1
0
void CascadedShadowPass::setup(GLRenderer *r) {
	
	if(gfx_shadowDebug.integer)
		target = glScreen;
	else
		target = shadowTarget;

	Pass::setup(r);
	
	if(!gfx_postProcessing.integer)
		target->makeTarget();
	
	saveGLSLQuality = gfx_GLSLQuality.integer;
	saveGrass = gfx_grass.integer;
	saveClouds = gfx_clouds.integer;
	
	if(!canRender()) {
		
		glScreen->makeTarget();
		return;
	}
	
	Cvar_SetVarValue(&gfx_sky, 0);
	Cvar_SetVarValue(&gfx_GLSLQuality, 1);
	Cvar_SetVarValue(&gfx_grass, 0);
	Cvar_SetVarValue(&gfx_clouds, 0);
	
	if(shadowSplit==0)
		updateSplitDist(shadowFrusta, scene_cam->nearclip, scene_cam->farclip);
	
	if(gfx_shadowQuality.integer >= 2) {
		GL_PopCamera();
		GL_PushCSMCamera(viewer, scene_cam, shadowSplit);   //CSM or UniformSM
	}

	if(!gfx_shadowDebug.integer)
		((GLDepthRenderTarget*)target)->makeTargetLayer(shadowSplit);
	
	shadowSplit++;
	
	glClear(GL_DEPTH_BUFFER_BIT);
	
	GL_Disable(GL_LIGHTING);
	GL_Disable(GL_POLYGON_SMOOTH);
	if(!gfx_shadowDebug.integer)
		glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
	glShadeModel(GL_FLAT);
	//GL_CullFace(GL_FRONT);
	
	layer2_enabled = terrain_layer2.integer;
	layer3_enabled = terrain_layer3.integer;
	Cvar_SetVarValue(&terrain_layer2, 0);
	Cvar_SetVarValue(&terrain_layer3, 0);
}
Exemplo n.º 2
0
//-----------------------------------------------------------------------------
//! 正射影行列の初期化
//-----------------------------------------------------------------------------
void CascadedShadow::initOrthoMatrix()
{
	CameraBase*	cam = GmCameraMan()->getCurrentCamera();
	Vector3		camPos = cam->getPosition();
	Matrix		camMat = cam->getMatrix();

	// 分割距離の更新
	updateSplitDist(0.01f, 3000.0f);

	for (s32 i = 0; i<SPLIT_COUNT; ++i)
	{
		// 視錐台の8点を更新
		updateFrustumPoints(f[i], camPos, camMat);

		// 視線方向を求める
		Vector3 viewDir = -Vector3(camMat._m[2]).normalize();

		// 中心までの距離を求める
		f32 centerOfClip = f[i]._fard - f[i]._neard / 2.0f;
		_centerLength[i]  = centerOfClip + f[i]._neard;
		
		// 視線方向を中点までの距離にし、カメラ座標に足す
		Vector3 center = (viewDir * _centerLength[i]) + camPos;



		// 近クリップ面から遠クリップ面までの距離を求める
		Vector3 p1 = f[i]._point[0];
		Vector3 p2 = f[i]._point[4];
		Vector3 p3 = f[i]._point[6];

		Sphere  clipShpere = calcCircumscribeCircle(p1,p2,p3);

		// 半径を求める(半径がまだ正しくない模様現段階は少し大きめにする)
		f32	 rad = clipShpere.getRadius() * 1.2f;

		_depthProj[i] = Matrix::ortho(-rad, rad, -rad, rad, -rad, rad);
	}

	TaskModelX::setShadowProj(_depthProj);
}