단순 일조 실현
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;
}
기본 적 인 사고방식 은 먼저 쇠퇴 치 를 계산 한 다음 에 빛 을 계산한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
마우스를 멈추고 밝게 보이기 - 각각 gridview와 데이터 grid에서데이터grid의 ItemDataBound 이벤트에 다음 코드를 씁니다. girdview의 RowDataBound 이벤트에 다음 코드를 입력합니다....
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.