📄 vgpcodegen.c
字号:
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 + -