단순 일조 실현

4033 단어 이루어지다
이 편 은 단순 일조 모형 의 이론 을 바탕 으로 이 루어 진 실현 으로 평행 광 점, 광원, 원추형 빛 의 효과 도 빛 의 가장 기본 적 인 입문 편 이 라 고 할 수 있다.
 
1. cbuffer: 여기 서 강조해 야 할 것 은 Cbuffer 의 데이터 구 조 를 구성 할 때 필드 의 순 서 를 주의해 야 하 며 오류 가 발생 하기 쉽다 는 것 입 니 다.
중요: HLSL 의 구조 체 struct 는 사실 당신 이 하나의 변수 든 몇 개의 변수 든 한 번 에 하나의 float 4 를 가득 채 우 는 메모리 길이 에 따라 몇 개의 변 수 를 하나의 float 4 에 넣 고 가득 채 우 고 다음 float 4 를 넣 는 것 입 니 다.테스트 결과 에 따 르 면 cbuffer 의 길 이 는 float 4 의 정수 배 여야 합 니 다. float + float 3 의 이러한 조합 이 데 이 터 를 정상적으로 얻 을 수 있 는 지, float + float + float 3 + float 3 의 조합 이 데 이 터 를 정상적으로 분배 할 수 있 는 지, 관건 은 GPU 의 메모리 배분 규칙 에 달 려 있 습 니 다.
//   
struct LightBuffer
{
    float mType; //      4   
    Vector3 mPosition; //     
    float mAngleInnerCone; //      
    Vector3 mAttenuation; //     ,  =1/(x+ y* D+ z* D* D),D     
    float mAngleOuterCone; //      
    Vector3 mDirection; //          
	
    //                  
    Color4 mColorAmbient; //         
    Color4 mColorDiffuse; //          
    Color4 mColorSpecular; //         
};

//   
struct MaterialBuffer
{
	Vector3 cameraPosition; //      
	float shininess; //    
	Quaternion Ke;  //      
	Quaternion Ka;  //        
	Quaternion Kd;  //        
	Quaternion Ks;  //       
};

 
2. ps: 이 실현 은 ps 에서 이 루어 진 빛 입 니 다. vs 안에 실현 내용 이 거의 없습니다.
////////////////////////////////////////////////////////////////////////////////
// Pixel Shader
////////////////////////////////////////////////////////////////////////////////
float4 PortPixelShader(PixelInputType input) : SV_TARGET
{
	float4 resultColor = float4(0,0,0,1.0);
	float4 colorDiffuse = mColorDiffuse; //    
        float4 colorSpecular = mColorSpecular; //     

	float3 N = input.worldNormal; //    
	float3 L = float3(0,0,0); //    
	float3 V = cameraPosition - input.worldPosition.xyz; //         (    )

	//1.   
	resultColor = resultColor + Ke;
	//2.   
	resultColor = resultColor + Ka * mColorAmbient; //      (x1*y1,x2*y2,x3*y3,x4*y4)

	int type = mType;
	float atte = 1.0; //     
	float d = distance(mPosition, input.worldPosition.xyz); //        
	switch(type)
      {
       case 1: //     
	   L = mDirection;
       break;
       case 2: //    
	   L = mPosition - input.worldPosition.xyz; //       -->  
	   atte = 1 / (mAttenuation.x + mAttenuation.y * d + mAttenuation.z * d * d);
	   //atte = 1 / (1 + 0.01 * d + 0.0001 * d * d);
       break;
       case 3: //     
	   L = mPosition - input.worldPosition.xyz; //       
	   atte = 1 / (mAttenuation.x + mAttenuation.y * d + mAttenuation.z * d * d);
	   //θ<α<φ   cos     ,        PI
	   L = normalize(L);
	   float3 direction = normalize(mDirection); //      ,   
	   float cosa = dot(L, direction);
	   float coso = cos(mAngleOuterCone);
	   if(cosa<cos(mAngleInnerCone) && cosa>coso) //    
	   {
		   atte = atte*(cosa - coso); //       
	   }else if(cosa<coso)
	   {
		   atte = 0;
	   }
       break;
       default:
       break;
       }

	//         
	N = normalize(N);
	L = normalize(L);
	V = normalize(V);

	//3.   
	float diff = max(dot(L, N),0); // L.N   ,         ,      。
	resultColor = resultColor + Kd * colorDiffuse * diff * atte; //      :Dintensity*Dcolor *N.L,saturate    [0,1]   
	//4.    
	float3 R = normalize(2 * diff * N - L); //          
	resultColor = resultColor + Ks * colorSpecular * atte * pow(saturate(dot(R, V)), shininess); // R.V^n           

	return resultColor;
}
 기본 적 인 사고방식 은 먼저 쇠퇴 치 를 계산 한 다음 에 빛 을 계산한다.

좋은 웹페이지 즐겨찾기