• Advertisement
Sign in to follow this  

lambert shader help

This topic is 3087 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

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

	vs.1.1
	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
	ps.1.1
	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
Advertisement
Sign in to follow this  

  • Advertisement