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

📄 brw_vs_tnl.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 4 页
字号:
      struct ureg spot = get_temp(p);      struct ureg slt = get_temp(p);      emit_op2(p, OPCODE_DP3, spot, 0, ureg_negate(VPpli), spot_dir_norm);      emit_op2(p, OPCODE_SLT, slt, 0, swizzle1(spot_dir_norm,W), spot);      emit_op2(p, OPCODE_POW, spot, 0, spot, swizzle1(attenuation, W));      emit_op2(p, OPCODE_MUL, att, 0, slt, spot);      release_temp(p, spot);      release_temp(p, slt);   }   /* Calculate distance attenuation:    */   if (p->state->unit[i].light_attenuated) {      /* 1/d,d,d,1/d */      emit_op1(p, OPCODE_RCP, dist, WRITEMASK_YZ, dist);       /* 1,d,d*d,1/d */      emit_op2(p, OPCODE_MUL, dist, WRITEMASK_XZ, dist, swizzle1(dist,Y));       /* 1/dist-atten */      emit_op2(p, OPCODE_DP3, dist, 0, attenuation, dist);       if (!p->state->unit[i].light_spotcutoff_is_180) {	 /* dist-atten */	 emit_op1(p, OPCODE_RCP, dist, 0, dist); 	 /* spot-atten * dist-atten */	 emit_op2(p, OPCODE_MUL, att, 0, dist, att);	      } else {	 /* dist-atten */	 emit_op1(p, OPCODE_RCP, att, 0, dist);       }   }   return att;}						/* Need to add some addtional parameters to allow lighting in object * space - STATE_SPOT_DIRECTION and STATE_HALF_VECTOR implicitly assume eye * space lighting. */static void build_lighting( struct tnl_program *p ){   const GLboolean twoside = p->state->light_twoside;   const GLboolean separate = p->state->separate_specular;   GLuint nr_lights = 0, count = 0;   struct ureg normal = get_eye_normal(p);   struct ureg lit = get_temp(p);   struct ureg dots = get_temp(p);   struct ureg _col0 = undef, _col1 = undef;   struct ureg _bfc0 = undef, _bfc1 = undef;   GLuint i;   for (i = 0; i < MAX_LIGHTS; i++)       if (p->state->unit[i].light_enabled)	 nr_lights++;      set_material_flags(p);   {      struct ureg shininess = get_material(p, 0, STATE_SHININESS);      emit_op1(p, OPCODE_MOV, dots,  WRITEMASK_W, swizzle1(shininess,X));      release_temp(p, shininess);      _col0 = make_temp(p, get_scenecolor(p, 0));      if (separate)	 _col1 = make_temp(p, get_identity_param(p));      else	 _col1 = _col0;   }   if (twoside) {      struct ureg shininess = get_material(p, 1, STATE_SHININESS);      emit_op1(p, OPCODE_MOV, dots, WRITEMASK_Z, 	       ureg_negate(swizzle1(shininess,X)));      release_temp(p, shininess);      _bfc0 = make_temp(p, get_scenecolor(p, 1));      if (separate)	 _bfc1 = make_temp(p, get_identity_param(p));      else	 _bfc1 = _bfc0;   }   /* If no lights, still need to emit the scenecolor.    */   /* KW: changed to do this always - v1.17 "Fix lighting alpha result"?     */   if (p->state->fragprog_inputs_read & FRAG_BIT_COL0)   {      struct ureg res0 = register_output( p, VERT_RESULT_COL0 );      emit_op1(p, OPCODE_MOV, res0, 0, _col0);      if (twoside) {	 struct ureg res0 = register_output( p, VERT_RESULT_BFC0 );	 emit_op1(p, OPCODE_MOV, res0, 0, _bfc0);      }   }   if (separate && (p->state->fragprog_inputs_read & FRAG_BIT_COL1)) {      struct ureg res1 = register_output( p, VERT_RESULT_COL1 );      emit_op1(p, OPCODE_MOV, res1, 0, _col1);            if (twoside) {	 struct ureg res1 = register_output( p, VERT_RESULT_BFC1 );	 emit_op1(p, OPCODE_MOV, res1, 0, _bfc1);      }   }         if (nr_lights == 0) {      release_temps(p);      return;   }   for (i = 0; i < MAX_LIGHTS; i++) {      if (p->state->unit[i].light_enabled) {	 struct ureg half = undef;	 struct ureg att = undef, VPpli = undef;	  	 count++;	 if (p->state->unit[i].light_eyepos3_is_zero) {	    /* Can used precomputed constants in this case.	     * Attenuation never applies to infinite lights.	     */	    VPpli = register_param3(p, STATE_LIGHT, i, 				    STATE_POSITION_NORMALIZED);             if (p->state->light_local_viewer) {                struct ureg eye_hat = get_eye_position_normalized(p);                half = get_temp(p);                emit_op2(p, OPCODE_SUB, half, 0, VPpli, eye_hat);                emit_normalize_vec3(p, half, half);            } else {                half = register_param3(p, STATE_LIGHT, i, STATE_HALF_VECTOR);            }	 } 	 else {	    struct ureg Ppli = register_param3(p, STATE_LIGHT, i, 					       STATE_POSITION); 	    struct ureg V = get_eye_position(p);	    struct ureg dist = get_temp(p);	    struct ureg tmpPpli = get_temp(p);	    VPpli = get_temp(p); 	    half = get_temp(p);	    /* In homogeneous object coordinates	     */	    emit_op1(p, OPCODE_RCP, dist, 0, swizzle1(Ppli, W));	    emit_op2(p, OPCODE_MUL, tmpPpli, 0, Ppli, dist); 	    /* Calulate VPpli vector	     */	    emit_op2(p, OPCODE_SUB, VPpli, 0, tmpPpli, V); 	    /* Normalize VPpli.  The dist value also used in	     * attenuation below.	     */	    emit_op2(p, OPCODE_DP3, dist, 0, VPpli, VPpli);	    emit_op1(p, OPCODE_RSQ, dist, 0, dist);	    emit_op2(p, OPCODE_MUL, VPpli, 0, VPpli, dist);	    /* Calculate  attenuation:	     */ 	    if (!p->state->unit[i].light_spotcutoff_is_180 ||		p->state->unit[i].light_attenuated) {	       att = calculate_light_attenuation(p, i, VPpli, dist);	    }	       	    /* Calculate viewer direction, or use infinite viewer:	     */	    if (p->state->light_local_viewer) {	       struct ureg eye_hat = get_eye_position_normalized(p);	       emit_op2(p, OPCODE_SUB, half, 0, VPpli, eye_hat);	    }	    else {	       struct ureg z_dir = swizzle(get_identity_param(p),X,Y,W,Z); 	       emit_op2(p, OPCODE_ADD, half, 0, VPpli, z_dir);	    }	    emit_normalize_vec3(p, half, half);	    release_temp(p, dist);	    release_temp(p, tmpPpli);	 }	 /* Calculate dot products:	  */	 emit_op2(p, OPCODE_DP3, dots, WRITEMASK_X, normal, VPpli);	 emit_op2(p, OPCODE_DP3, dots, WRITEMASK_Y, normal, half);		 /* Front face lighting:	  */	 {	    struct ureg ambient = get_lightprod(p, i, 0, STATE_AMBIENT);	    struct ureg diffuse = get_lightprod(p, i, 0, STATE_DIFFUSE);	    struct ureg specular = get_lightprod(p, i, 0, STATE_SPECULAR);	    struct ureg res0, res1;	    GLuint mask0, mask1;	    emit_op1(p, OPCODE_LIT, lit, 0, dots);   	    if (!is_undef(att)) 	       emit_op2(p, OPCODE_MUL, lit, 0, lit, att);	    mask0 = 0;	    mask1 = 0;	    res0 = _col0;	    res1 = _col1;	    	    if (count == nr_lights) {	       if (separate) {		  mask0 = WRITEMASK_XYZ;		  mask1 = WRITEMASK_XYZ;		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL0)		     res0 = register_output( p, VERT_RESULT_COL0 );		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL1)		     res1 = register_output( p, VERT_RESULT_COL1 );	       }	       else {		  mask1 = WRITEMASK_XYZ;		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL0)		     res1 = register_output( p, VERT_RESULT_COL0 );	       }	    } 	    emit_op3(p, OPCODE_MAD, _col0, 0, swizzle1(lit,X), ambient, _col0);	    emit_op3(p, OPCODE_MAD, res0, mask0, swizzle1(lit,Y), diffuse, _col0);	    emit_op3(p, OPCODE_MAD, res1, mask1, swizzle1(lit,Z), specular, _col1);      	    release_temp(p, ambient);	    release_temp(p, diffuse);	    release_temp(p, specular);	 }	 /* Back face lighting:	  */	 if (twoside) {	    struct ureg ambient = get_lightprod(p, i, 1, STATE_AMBIENT);	    struct ureg diffuse = get_lightprod(p, i, 1, STATE_DIFFUSE);	    struct ureg specular = get_lightprod(p, i, 1, STATE_SPECULAR);	    struct ureg res0, res1;	    GLuint mask0, mask1;	       	    emit_op1(p, OPCODE_LIT, lit, 0, ureg_negate(swizzle(dots,X,Y,W,Z)));	    if (!is_undef(att)) 	       emit_op2(p, OPCODE_MUL, lit, 0, lit, att);	    mask0 = 0;	    mask1 = 0;	    res0 = _bfc0;	    res1 = _bfc1;	    if (count == nr_lights) {	       if (separate) {		  mask0 = WRITEMASK_XYZ;		  mask1 = WRITEMASK_XYZ;		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL0)		     res0 = register_output( p, VERT_RESULT_BFC0 );		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL1)		     res1 = register_output( p, VERT_RESULT_BFC1 );	       }	       else {		  mask1 = WRITEMASK_XYZ;		  if (p->state->fragprog_inputs_read & FRAG_BIT_COL0)		     res1 = register_output( p, VERT_RESULT_BFC0 );	       }	    }	    emit_op3(p, OPCODE_MAD, _bfc0, 0, swizzle1(lit,X), ambient, _bfc0);	    emit_op3(p, OPCODE_MAD, res0, mask0, swizzle1(lit,Y), diffuse, _bfc0);	    emit_op3(p, OPCODE_MAD, res1, mask1, swizzle1(lit,Z), specular, _bfc1);	    release_temp(p, ambient);	    release_temp(p, diffuse);	    release_temp(p, specular);	 }	 release_temp(p, half);	 release_temp(p, VPpli);	 release_temp(p, att);      }   }   release_temps( p );}static void build_fog( struct tnl_program *p ){   struct ureg fog = register_output(p, VERT_RESULT_FOGC);   struct ureg input;   GLuint useabs = p->state->fog_source_is_depth && p->state->fog_option &&		   (p->state->fog_option != FOG_EXP2);   if (p->state->fog_source_is_depth) {      input = swizzle1(get_eye_position(p), Z);   }   else {      input = swizzle1(register_input(p, VERT_ATTRIB_FOG), X);      if (p->state->fog_option &&	  p->state->tnl_do_vertex_fog)	  input = swizzle1(register_input(p, VERT_ATTRIB_FOG), X);      else	  input = register_input(p, VERT_ATTRIB_FOG);   }   if (p->state->fog_option &&       p->state->tnl_do_vertex_fog) {      struct ureg params = register_param2(p, STATE_INTERNAL,					   STATE_FOG_PARAMS_OPTIMIZED);      struct ureg tmp = get_temp(p);      struct ureg id = get_identity_param(p);      emit_op1(p, OPCODE_MOV, fog, 0, id);      if (useabs) {	 emit_op1(p, OPCODE_ABS, tmp, 0, input);      }      switch (p->state->fog_option) {      case FOG_LINEAR: {	 emit_op3(p, OPCODE_MAD, tmp, 0, useabs ? tmp : input,			swizzle1(params,X), swizzle1(params,Y));	 emit_op2(p, OPCODE_MAX, tmp, 0, tmp, swizzle1(id,X)); /* saturate */	 emit_op2(p, OPCODE_MIN, fog, WRITEMASK_X, tmp, swizzle1(id,W));	 break;      }      case FOG_EXP:	 emit_op2(p, OPCODE_MUL, tmp, 0, useabs ? tmp : input,			swizzle1(params,Z));	 emit_op1(p, OPCODE_EX2, fog, WRITEMASK_X, ureg_negate(tmp));	 break;      case FOG_EXP2:	 emit_op2(p, OPCODE_MUL, tmp, 0, input, swizzle1(params,W));	 emit_op2(p, OPCODE_MUL, tmp, 0, tmp, tmp);	 emit_op1(p, OPCODE_EX2, fog, WRITEMASK_X, ureg_negate(tmp));	 break;      }      release_temp(p, tmp);   }   else {      /* results = incoming fog coords (compute fog per-fragment later)        *       * KW:  Is it really necessary to do anything in this case?       */      emit_op1(p, useabs ? OPCODE_ABS : OPCODE_MOV, fog, 0, input);   }} static void build_reflect_texgen( struct tnl_program *p,				  struct ureg dest,				  GLuint writemask ){   struct ureg normal = get_eye_normal(p);   struct ureg eye_hat = get_eye_position_normalized(p);   struct ureg tmp = get_temp(p);   /* n.u */   emit_op2(p, OPCODE_DP3, tmp, 0, normal, eye_hat);    /* 2n.u */   emit_op2(p, OPCODE_ADD, tmp, 0, tmp, tmp);    /* (-2n.u)n + u */   emit_op3(p, OPCODE_MAD, dest, writemask, ureg_negate(tmp), normal, eye_hat);   release_temp(p, tmp);}static void build_sphere_texgen( struct tnl_program *p,				 struct ureg dest,				 GLuint writemask ){   struct ureg normal = get_eye_normal(p);   struct ureg eye_hat = get_eye_position_normalized(p);   struct ureg tmp = get_temp(p);   struct ureg half = register_scalar_const(p, .5);   struct ureg r = get_temp(p);   struct ureg inv_m = get_temp(p);   struct ureg id = get_identity_param(p);   /* Could share the above calculations, but it would be    * a fairly odd state for someone to set (both sphere and    * reflection active for different texture coordinate    * components.  Of course - if two texture units enable    * reflect and/or sphere, things start to tilt in favour    * of seperating this out:    */   /* n.u */   emit_op2(p, OPCODE_DP3, tmp, 0, normal, eye_hat);    /* 2n.u */   emit_op2(p, OPCODE_ADD, tmp, 0, tmp, tmp);    /* (-2n.u)n + u */   emit_op3(p, OPCODE_MAD, r, 0, ureg_negate(tmp), normal, eye_hat);    /* r + 0,0,1 */   emit_op2(p, OPCODE_ADD, tmp, 0, r, swizzle(id,X,Y,W,Z));    /* rx^2 + ry^2 + (rz+1)^2 */   emit_op2(p, OPCODE_DP3, tmp, 0, tmp, tmp);    /* 2/m */   emit_op1(p, OPCODE_RSQ, tmp, 0, tmp);    /* 1/m */   emit_op2(p, OPCODE_MUL, inv_m, 0, tmp, half);    /* r/m + 1/2 */   emit_op3(p, OPCODE_MAD, dest, writemask, r, inv_m, half); 	          release_temp(p, tmp);   release_temp(p, r);   release_temp(p, inv_m);}

⌨️ 快捷键说明

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