⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vgpcodegen.c

📁 Lido PXA270平台开发板的最新BSP,包括源代码
💻 C
📖 第 1 页 / 共 3 页
字号:
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP03, VGP_DMASK_W, VGP_SRC_R0, VGP_USERCLIPPLANE_3);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP45, VGP_DMASK_X, VGP_SRC_R0, VGP_USERCLIPPLANE_4);
		GLES_VGP2(&pui32VGPCode, VGP_DP4, VGP_OUT_USERCLIP45, VGP_DMASK_Y, VGP_SRC_R0, VGP_USERCLIPPLANE_5);
#endif
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)			|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)				|
													VGP_SECTIONDEF_EXECOUNT(1)									|
													VGP_SECTIONDEF_CONST_OFFSET(VGP_USERCLIPPLANES_START)	|
													VGP_SECTIONDEF_CONST_END(VGP_USERCLIPPLANES_END);


	/* 
		Section 3: Lighting Setup 
		-------------------------
	*/
	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_INVTMODELVIEW_START);

	VGP_SECTION_START()

		/* Transform normal */
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R1, VGP_DMASK_X, VGP_SRC_V(VGP_VERTEX_NORMAL), VGP_INVTMODELVIEW0);
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R1, VGP_DMASK_Y, VGP_SRC_V(VGP_VERTEX_NORMAL), VGP_INVTMODELVIEW1);
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R1, VGP_DMASK_Z, VGP_SRC_V(VGP_VERTEX_NORMAL), VGP_INVTMODELVIEW2);
		
		/* Colour-track/colour-material register set-up */
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_DEST_R10, VGP_DMASK_ALL, VGP_MAT_AMBIENT);
	
		/* r11 = diffuse */
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_DEST_R11, VGP_DMASK_ALL, VGP_MAT_DIFFUSE);
	
		/* r13 = specular */
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_DEST_R13, VGP_DMASK_ALL, VGP_MAT_SPECULAR);

		/* r5 = emission */
		GLES_VGP1(&pui32VGPCode, VGP_MOV, VGP_DEST_R5, VGP_DMASK_ALL, VGP_MAT_EMISSION);

		/* Setup temp with 0 */
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R12, VGP_DMASK_ALL, VGP_ZEROZEROONEZERO, VGP_SWIZ_ALL_X);
		
		/* Zero specular colour */
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R3, VGP_DMASK_ALL, VGP_ZEROZEROONEZERO, VGP_SWIZ_ALL_X);

		/* r5 = usematerial ? material emission : 0 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5, VGP_SWIZ_NONE, 
						VGP_COLTRK_USE_MATERIAL, VGP_SWIZ_EMISSION);

		/* r10 = usematerial ? material ambient : 0 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MUL, VGP_DEST_R10, VGP_DMASK_ALL, VGP_SRC_R10, VGP_SWIZ_NONE, 
						VGP_COLTRK_USE_MATERIAL, VGP_SWIZ_AMBIENT);

		/* r11 = usematerial ? material diffuse : 0 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MUL, VGP_DEST_R11, VGP_DMASK_ALL, VGP_SRC_R11, VGP_SWIZ_NONE, 
						VGP_COLTRK_USE_MATERIAL, VGP_SWIZ_DIFFUSE);

		/* r13 = usematerial ? material specular : 0 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MUL, VGP_DEST_R13, VGP_DMASK_ALL, VGP_SRC_R13, VGP_SWIZ_NONE, 
						VGP_COLTRK_USE_MATERIAL, VGP_SWIZ_SPECULAR);
	

		/*	
			Lighting constant relative addressing setup.

			R12 will store the value of the constant offset register a0, as it cannot be used as a source. 
			AMV always targets a0, regardless of destination field 
			HW_PRN_270 AMV latency is hidden by following instructions
		*/
		GLES_VGP1(&pui32VGPCode, VGP_AMV, VGP_DEST_R1,	 VGP_DMASK_ALL, VGP_SRC_R12);

		/* r5 = usematerial ? material emission : vertex colour */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_BASECOL), 
						VGP_SWIZ_NONE, VGP_COLTRK_USE_VERTEXCOLOR, VGP_SWIZ_EMISSION, VGP_SRC_R5, VGP_SWIZ_NONE);

		/* r10 = usematerial ? material ambient : vertex colour */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R10, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_BASECOL), 
						VGP_SWIZ_NONE, VGP_COLTRK_USE_VERTEXCOLOR, VGP_SWIZ_AMBIENT, VGP_SRC_R10, VGP_SWIZ_NONE);

		/* r11 = usematerial ? material diffuse : vertex colour */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R11, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_BASECOL), 
						VGP_SWIZ_NONE, VGP_COLTRK_USE_VERTEXCOLOR, VGP_SWIZ_DIFFUSE, VGP_SRC_R11, VGP_SWIZ_NONE);

		/* r13 = usematerial ? material specular : vertex colour */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R13, VGP_DMASK_ALL, VGP_SRC_V(VGP_VERTEX_BASECOL), 
						VGP_SWIZ_NONE, VGP_COLTRK_USE_VERTEXCOLOR, VGP_SWIZ_SPECULAR, VGP_SRC_R13, VGP_SWIZ_NONE);

		/* r2 = mat ambient/vertex color * scene ambient */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SCENE_AMBIENT, VGP_SRC_R10);

		/* r2 = material ambient * scene ambient + material emission */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SRC_R2, VGP_SRC_R5);
	

	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)		|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)			|
													VGP_SECTIONDEF_EXECOUNT(1)								|
													VGP_SECTIONDEF_CONST_OFFSET(VGP_INVTMODELVIEW_START)	|
													VGP_SECTIONDEF_CONST_END(VGP_FIXED_CONSTANTS_END);

	/* Section 4: Normalise Normal */
	VGP_SECTION_START()
		GLES_VGP2(&pui32VGPCode, VGP_DP3,	 VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R1, VGP_SRC_R1);
		GLES_VGP1(&pui32VGPCode, VGP_RSQRT,  VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5);
		GLES_VGP2(&pui32VGPCode, VGP_MUL,	 VGP_DEST_R1, VGP_DMASK_ALL, VGP_SRC_R1, VGP_SRC_R5);
	VGP_SECTION_END()
	
	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(128)					|
													VGP_SECTIONDEF_CONST_END(0);

	/* 
		Sections 5-8: Lighting
		----------------------
	*/


	/* 
	 * Section 5: Infinite lighting 
	 */

	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_MATERIAL_START);

	VGP_SECTION_START()
		/* r5 = colour/material diffuse * light diffuse */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R11, VGP_LIGHT_DIFFUSE | VGP_SRC_CADDR_REL);

		/* r12 = r12 + size of light constants */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R12, VGP_DMASK_ALL, VGP_SRC_R12, VGP_LIGHT_SIZE);

		/* Setup for the lit instruction:
		   r6.x = normal dot light direction
		   r6.y = normal dot hHat
		   r6.w = material shininess */
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R6,		VGP_DMASK_X, VGP_SRC_R1, 
					VGP_LIGHT_DIRECTION | VGP_SRC_CADDR_REL);
		
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R6,		VGP_DMASK_Y, VGP_SRC_R1, 
					VGP_LIGHT_HHAT | VGP_SRC_CADDR_REL);
		
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R6, VGP_DMASK_W, VGP_MAT_SHININESS, VGP_SWIZ_ALL_X);

		/* r2 = r2 + colour/material ambient * light ambient */
		GLES_VGP3(&pui32VGPCode, VGP_MAD, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SRC_R10, 
					VGP_LIGHT_AMBIENT | VGP_SRC_CADDR_REL, VGP_SRC_R2);
		
		/* After execution of the lit instruction:
			r6.y = diffuse lighting term (or 0)
			r6.z = specular lighting term (or 0)
		*/
 		GLES_VGP1(&pui32VGPCode, VGP_LIT, VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R6);


		/* r2 = dot (r6.y) * colour/material diffuse * light diffuse + r2 */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SWIZ_ALL_Y, VGP_SRC_R5, 
						VGP_SWIZ_NONE, VGP_SRC_R2, VGP_SWIZ_NONE);
					
		/* r5 = material specular * light specular */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R13, VGP_LIGHT_SPECULAR | VGP_SRC_CADDR_REL);

		/* a0 = new relative addressing offset for next light */
		GLES_VGP1(&pui32VGPCode, VGP_AMV, VGP_DEST_R1, VGP_DMASK_ALL, VGP_SRC_R12);
	
		/* r3 = specular lighting term (r6.z) * material specular * light specular + r3 */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R3, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SWIZ_ALL_Z, VGP_SRC_R5, 
						VGP_SWIZ_NONE, VGP_SRC_R3, VGP_SWIZ_NONE);
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(VGP_MATERIAL_START)		|
													VGP_SECTIONDEF_CONST_END(VGP_FIXED_CONSTANTS_END);

	/* 
	 * Section 6: Point light source lighting 
	 */
	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_MATERIAL_START);

	VGP_SECTION_START()
		/* r12 = r12 + size of light constants */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R12, VGP_DMASK_ALL, VGP_SRC_R12, VGP_LIGHT_SIZE);

		/* Calculate light->vertex vector */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R5,	VGP_DMASK_ALL, VGP_LIGHT_POSITION | VGP_SRC_CADDR_REL, VGP_NEGATE(VGP_SRC_R0));
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R5, VGP_SRC_R5);
		GLES_VGP1(&pui32VGPCode, VGP_RSQRT, VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R7);

		/* Normalise light->vertex vector */
		/* r5 = Ppl - v' = ^vPli */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5, VGP_SRC_R6);

		/* Calculate distance attenuation into r7. Dst of light->vertex vector */
		GLES_VGP2(&pui32VGPCode, VGP_DST, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7, VGP_SRC_R6);
	
		/* r6 = (0 0 1)T */
		GLES_VGP2(&pui32VGPCode, VGP_ADD,   VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R5, VGP_ZEROZEROONEZERO);
		
		/* Continuing attenuation calc */
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7, VGP_LIGHT_ATT | VGP_SRC_CADDR_REL);

		/* Calculate specular lighting half-angle, hHat, into r6.
		   Since we have an infinite viewer, h = light->vertex vector + (0 0 1)T 
		*/
		GLES_VGP2(&pui32VGPCode, VGP_DP3,   VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SRC_R6);
		
		/* Completing attenuation calc */
		GLES_VGP1(&pui32VGPCode, VGP_RCP, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7);
		
		/* Continuing half-angle calc */
		GLES_VGP1(&pui32VGPCode, VGP_RSQRT, VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R8);
		GLES_VGP2(&pui32VGPCode, VGP_MUL,   VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SRC_R8);


		/* Setup for the lit instruction:
		   r8.x = normal dot light direction
		   r8.y = normal dot hHat 
		*/
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R8,		VGP_DMASK_X, VGP_SRC_R1, VGP_SRC_R5);
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R8,		VGP_DMASK_Y, VGP_SRC_R1, VGP_SRC_R6);
	
		/* r5 = distance attenuation * colour-material ambient */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R10, VGP_SRC_R7);
	
		/* Setup for the lit instruction:
		   r8.w = material shininess */
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R8, VGP_DMASK_W, VGP_MAT_SHININESS, VGP_SWIZ_ALL_X);
		
		
		/* r2 = r2 + distance attenuation * colour-material ambient * light ambient */
		GLES_VGP3(&pui32VGPCode, VGP_MAD, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SRC_R5, 
					VGP_LIGHT_AMBIENT | VGP_SRC_CADDR_REL, VGP_SRC_R2);

		/* r5 = distance attenuation * colour/material diffuse */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R11, VGP_SRC_R7);

		/* After execution of the lit instruction:
			r8.y = diffuse lighting term (or 0)
			r8.z = specular lighting term (or 0)
		*/
		GLES_VGP1(&pui32VGPCode, VGP_LIT, VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R8);

		/* r5 = distance attenuation * colour/material diffuse * light Diffuse */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5, VGP_LIGHT_DIFFUSE | VGP_SRC_CADDR_REL);

		/* r2 = dot (r8.y) * distance attenuation * colour-material diffuse * light diffuse + r2 */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R2, VGP_DMASK_ALL, VGP_SRC_R8, VGP_SWIZ_ALL_Y, VGP_SRC_R5, 
						VGP_SWIZ_NONE, VGP_SRC_R2, VGP_SWIZ_NONE);
					
		/* r5 = distance attenuation * material specular * light specular */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R13, VGP_SRC_R7);
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5, VGP_LIGHT_SPECULAR | VGP_SRC_CADDR_REL);

		/* a0 = new relative addressing offset for next light */
		GLES_VGP1(&pui32VGPCode, VGP_AMV, VGP_DEST_R1, VGP_DMASK_ALL, VGP_SRC_R12);
		
		/* r3 = specular lighting term (r8.z) * material specular * light specular + r3 */
		GLES_VGP_SWIZ3(&pui32VGPCode, VGP_MAD, VGP_DEST_R3, VGP_DMASK_ALL, VGP_SRC_R8, VGP_SWIZ_ALL_Z, VGP_SRC_R5, 
						VGP_SWIZ_NONE, VGP_SRC_R3, VGP_SWIZ_NONE);
		
	VGP_SECTION_END()

	pui32VGPSectionDefinitions[ui32SectionNum++] =	 VGP_SECTIONDEF_STARTADDR(ui32SectionStartAddress)	|
													VGP_SECTIONDEF_ENDADDR(ui32SectionEndAddress)		|
													VGP_SECTIONDEF_EXECOUNT(1)							|
													VGP_SECTIONDEF_CONST_OFFSET(VGP_MATERIAL_START)		|
													VGP_SECTIONDEF_CONST_END(VGP_FIXED_CONSTANTS_END);

	/* 
	 * Section 7: Spotlight lighting 
	 */
	gui32ConstantRemap = VGP_CONSTANT_REMAP(VGP_MATERIAL_START);

	VGP_SECTION_START()
		/* Calculate light->vertex vector */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R5,	VGP_DMASK_ALL, VGP_LIGHT_POSITION | VGP_SRC_CADDR_REL, VGP_NEGATE(VGP_SRC_R0));

		/* r12 = r12 + size of light constants */
		GLES_VGP2(&pui32VGPCode, VGP_ADD, VGP_DEST_R12, VGP_DMASK_ALL, VGP_SRC_R12, VGP_LIGHT_SIZE);

		/* Continue light->vertex vector calc*/
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R5, VGP_SRC_R5);
		GLES_VGP1(&pui32VGPCode, VGP_RSQRT, VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R7);

		/* Normalise light->vertex vector */
		/* r5 = Ppl - v' = ^vPli*/
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R5, VGP_SRC_R6);
	
		/* Calculate distance attenuation into r7 */
		GLES_VGP2(&pui32VGPCode, VGP_DST, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7, VGP_SRC_R6);
	
		/* Calculate spotlight attenuation */
		/* r8 = vertex->light vector dot spot direction */
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R8, VGP_DMASK_ALL, VGP_NEGATE(VGP_SRC_R5), 
					VGP_LIGHT_DIRECTION | VGP_SRC_CADDR_REL);
		
		
		/* Continue distance attenuation into r7 */		
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7, VGP_LIGHT_ATT | VGP_SRC_CADDR_REL);

		/* if(r8 > cosine(spot cut off)) then r6 = 1.0 else r6 = 0.0 */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_SGE, VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R8, VGP_SWIZ_NONE, 
					VGP_LIGHT_SPOT_PARAMS | VGP_SRC_CADDR_REL, VGP_SWIZ_ALL_Y);

		/* Set up for lit instruction to calc spot effect */
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R8, VGP_DMASK_X, VGP_ZEROZEROONEZERO, VGP_SWIZ_ALL_Z);
	
		/* Complete distance attenuation into r7 */		
		GLES_VGP1(&pui32VGPCode, VGP_RCP, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7);

		/* Continue set up for lit instruction to calc spot effect */
		GLES_VGP_SWIZ1(&pui32VGPCode, VGP_MOV, VGP_DEST_R8, VGP_DMASK_W, VGP_LIGHT_SPOT_PARAMS | VGP_SRC_CADDR_REL, 
						VGP_SWIZ_ALL_X);

		GLES_VGP1(&pui32VGPCode, VGP_LIT, VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R8);

		/* Multiply in the if()-test value calculated into r6 above */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SRC_R8);

		/* Calculate specular lighting half-angle, hHat, into r6.
		   Since we have an infinite viewer, h = light->vertex vector + (0 0 1)T 
		*/
		GLES_VGP2(&pui32VGPCode, VGP_ADD,   VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R5, VGP_ZEROZEROONEZERO);

		/* r7 = distance attenuation * spot attenuation */
		GLES_VGP_SWIZ2(&pui32VGPCode, VGP_MUL, VGP_DEST_R7, VGP_DMASK_ALL, VGP_SRC_R7, VGP_SWIZ_NONE, 
						VGP_SRC_R8, VGP_SWIZ_ALL_Z);

		/* Continue hHat into r6. */
		GLES_VGP2(&pui32VGPCode, VGP_DP3,   VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SRC_R6);
		GLES_VGP1(&pui32VGPCode, VGP_RSQRT, VGP_DEST_R8, VGP_DMASK_ALL, VGP_SRC_R8);
		GLES_VGP2(&pui32VGPCode, VGP_MUL,   VGP_DEST_R6, VGP_DMASK_ALL, VGP_SRC_R6, VGP_SRC_R8);

		/* Setup for the lit instruction:
		   r8.x = normal dot light direction
		   r8.y = normal dot hHat */
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R8,		VGP_DMASK_X, VGP_SRC_R1, VGP_SRC_R5);
		GLES_VGP2(&pui32VGPCode, VGP_DP3, VGP_DEST_R8,		VGP_DMASK_Y, VGP_SRC_R1, VGP_SRC_R6);
		
		/* r5 = distance attenuation * colour-material ambient */
		GLES_VGP2(&pui32VGPCode, VGP_MUL, VGP_DEST_R5, VGP_DMASK_ALL, VGP_SRC_R10, VGP_SRC_R7);
		
		/* Setup for the lit instruction:
		   r8.w = material shininess */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -