Sign in to follow this  

lambert shader help

Recommended Posts

hi there, I'm trying to implement a per-pixel lambert shader but I don't know what the best/fastest way to do this is, I currently have:
        // c0 - worldViewProject
        // c4 - world
        // c8 - point light matrix

	def c13, 0.5, 0.5, 0.5, 0.5
	dcl_position v0
	dcl_normal v1
	dcl_texcoord v2

	m4x4 oPos, v0, c0
	mov oT0, v2

        ; convert normal to range 0 - 1
	mul r0, v1, c13
	add r0, r0, c13

        ; interpolate normal across triangle
	mov oT2, r0

        ; r5 - world position of vertex
	m4x4 r5, v0, c4
        ; convert position into lights space
	m4x4 oT1, r5, c8

the point light matrix converts the 3d position into light space i.e. between -1 and 1 anything outside this range lies outside the radius of the light, it also moves the range from -1 to 1 to 0 - 1 by dividing by two and adding 0.5.

        // c0 - light color
	tex t0
	texcoord t1
	texcoord t2
	dp3_sat r0, t1_bx2, t1_bx2
	mul r0, c0, 1-r0
	mul r0, r0, t0

the dp3_sat intruction gives me the attenuation factor and clamps the value to 0 - 1 so that any values > 1 will remain at 1. The problem is that I need to be able to dot the normal (t2_bx2) with the inverse direction of (t1_bx2) but I don't think ps.1.1 supports any normalization intructions such as rsq, rcp etc. how can I get the two normals (light and surface) per-pixel? and is there any way to get the actual surface normal rather than using the interpolated vertex normals?

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this