Jump to content
  • Advertisement
Sign in to follow this  
GambitSnax

BRDF artifact

This topic is 4125 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've been working on a BRDF shader for a little while now and just have one final problem with it. The problem seems a little obtuse to me, but i'll do my best at explaining it. On the object's x-y plane, the object always reflects as if it is always pointing towards the light. The effect I get then is a nicely rendered BRDF object, but with a white jagged line all the way along the x-y plane of the object jutting backwards and forwards across the plane. As the coordinates at that point think it is pointing towards the light I get a strong specular reflection. I think it may be to do with my tangent frame coordinate generation as I don't have any texture coordinates for the initial object, and they are just generated from the vertex normals. Is it ok to do this? I've included my generation code below -
	// define vertex structure
	D3DVERTEXELEMENT9 VertexArray[] = 
	{
		{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},	// position
		{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TANGENT, 0},
		{0, 24, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_BINORMAL, 0},
		{0, 36, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
		D3DDECL_END()
	};

	LPD3DXMESH pMeshClonedBox = NULL;
	V_RETURN(a_pMesh->CloneMesh(D3DXMESH_MANAGED, VertexArray, pd3dDevice, &pMeshClonedBox))

	SAFE_RELEASE(a_pMesh);

	V_RETURN(D3DXComputeTangentFrameEx(pMeshClonedBox,	0, 0,
														D3DDECLUSAGE_BINORMAL, 0,
														D3DDECLUSAGE_TANGENT, 0,
														D3DDECLUSAGE_NORMAL, 0, 0, 0,
														0.01f, 0.25f, 0.01f, &a_pMesh, 0))

	SAFE_RELEASE(pMeshClonedBox);


There also might be a problem with my vertex shader but it looks fine to me. I've included it also. The BRDF technique used is Gram-Schmidt Half-Angle parametrization of a separable BRDF.
VSOutput VS(VSInput a_Input)
{
	VSOutput Output;

	Output.pos = mul(float4(a_Input.pos, 1.0f), g_matWorldViewProjection);
	float3 posW = mul(float4(a_Input.pos, 1.0f), g_matWorld);

	float3 toLight = normalize(mul((g_vecLightPos - posW), g_matWorldInverse));
	
	float3 toLightW = normalize(g_vecLightPos - posW);
	
	float3 toEye = normalize(mul((g_vecCameraPos - Output.pos), g_matWorldInverse));

	float3 halfVec = normalize(toEye + toLight);

	Output.coordH.x = dot(halfVec, a_Input.tan);
	Output.coordH.z = dot(halfVec, a_Input.bi);
	Output.coordH.y = dot(halfVec, a_Input.norm);

	float3 tPrime = normalize(a_Input.tan - (halfVec*dot(a_Input.tan, halfVec)));
	float3 bPrime = normalize(cross(halfVec, tPrime));

	Output.coordD.x = dot(toLight, tPrime);
	Output.coordD.z = dot(toLight, bPrime);
	Output.coordD.y = dot(toLight, halfVec);

	float3 norm = normalize(mul(float4(a_Input.norm, 0.0f), g_matWorld).xyz);
	float lightVal = max(dot(toLightW, norm), 0.0f);

	Output.col = lightVal * g_vecLightDiffuse;

	return Output;
}

The pixel shader simply uses the two calculated texture coordinates to lookup into the two texture maps and combines them together with a light intensity value (Output.col). Thanks for any suggestions of tips anyone might have. Cheers.

Share this post


Link to post
Share on other sites
Advertisement
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!