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

📄 s_texcombine.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
	       break;	    case GL_INTENSITY:	       for (i=0;i<n;i++) {		  /* Cv = It */                  GLchan It = texel[i][RCOMP];                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = It;                  /* Av = It */                  rgba[i][ACOMP] = It;	       }	       break;	    case GL_RGB:	       for (i=0;i<n;i++) {		  /* Cv = Ct */		  rgba[i][RCOMP] = texel[i][RCOMP];		  rgba[i][GCOMP] = texel[i][GCOMP];		  rgba[i][BCOMP] = texel[i][BCOMP];		  /* Av = Af */	       }	       break;	    case GL_RGBA:	       for (i=0;i<n;i++) {		  /* Cv = Ct */		  rgba[i][RCOMP] = texel[i][RCOMP];		  rgba[i][GCOMP] = texel[i][GCOMP];		  rgba[i][BCOMP] = texel[i][BCOMP];		  /* Av = At */		  rgba[i][ACOMP] = texel[i][ACOMP];	       }	       break;            default:               _mesa_problem(ctx, "Bad format (GL_REPLACE) in texture_apply");               return;	 }	 break;      case GL_MODULATE:         switch (format) {	    case GL_ALPHA:	       for (i=0;i<n;i++) {		  /* Cv = Cf */		  /* Av = AfAt */		  rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );	       }	       break;	    case GL_LUMINANCE:	       for (i=0;i<n;i++) {		  /* Cv = LtCf */                  GLchan Lt = texel[i][RCOMP];		  rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], Lt );		  rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], Lt );		  rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], Lt );		  /* Av = Af */	       }	       break;	    case GL_LUMINANCE_ALPHA:	       for (i=0;i<n;i++) {		  /* Cv = CfLt */                  GLchan Lt = texel[i][RCOMP];		  rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], Lt );		  rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], Lt );		  rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], Lt );		  /* Av = AfAt */		  rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );	       }	       break;	    case GL_INTENSITY:	       for (i=0;i<n;i++) {		  /* Cv = CfIt */                  GLchan It = texel[i][RCOMP];		  rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], It );		  rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], It );		  rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], It );		  /* Av = AfIt */		  rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], It );	       }	       break;	    case GL_RGB:	       for (i=0;i<n;i++) {		  /* Cv = CfCt */		  rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], texel[i][RCOMP] );		  rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], texel[i][GCOMP] );		  rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], texel[i][BCOMP] );		  /* Av = Af */	       }	       break;	    case GL_RGBA:	       for (i=0;i<n;i++) {		  /* Cv = CfCt */		  rgba[i][RCOMP] = CHAN_PRODUCT( rgba[i][RCOMP], texel[i][RCOMP] );		  rgba[i][GCOMP] = CHAN_PRODUCT( rgba[i][GCOMP], texel[i][GCOMP] );		  rgba[i][BCOMP] = CHAN_PRODUCT( rgba[i][BCOMP], texel[i][BCOMP] );		  /* Av = AfAt */		  rgba[i][ACOMP] = CHAN_PRODUCT( rgba[i][ACOMP], texel[i][ACOMP] );	       }	       break;            default:               _mesa_problem(ctx, "Bad format (GL_MODULATE) in texture_apply");               return;	 }	 break;      case GL_DECAL:         switch (format) {            case GL_ALPHA:            case GL_LUMINANCE:            case GL_LUMINANCE_ALPHA:            case GL_INTENSITY:               /* undefined */               break;	    case GL_RGB:	       for (i=0;i<n;i++) {		  /* Cv = Ct */		  rgba[i][RCOMP] = texel[i][RCOMP];		  rgba[i][GCOMP] = texel[i][GCOMP];		  rgba[i][BCOMP] = texel[i][BCOMP];		  /* Av = Af */	       }	       break;	    case GL_RGBA:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-At) + CtAt */		  GLchan t = texel[i][ACOMP], s = CHAN_MAX - t;		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(texel[i][RCOMP],t);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(texel[i][GCOMP],t);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(texel[i][BCOMP],t);		  /* Av = Af */	       }	       break;            default:               _mesa_problem(ctx, "Bad format (GL_DECAL) in texture_apply");               return;	 }	 break;      case GL_BLEND:         UNCLAMPED_FLOAT_TO_CHAN(Rc, texUnit->EnvColor[0]);         UNCLAMPED_FLOAT_TO_CHAN(Gc, texUnit->EnvColor[1]);         UNCLAMPED_FLOAT_TO_CHAN(Bc, texUnit->EnvColor[2]);         UNCLAMPED_FLOAT_TO_CHAN(Ac, texUnit->EnvColor[3]);	 switch (format) {	    case GL_ALPHA:	       for (i=0;i<n;i++) {		  /* Cv = Cf */		  /* Av = AfAt */                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);	       }	       break;            case GL_LUMINANCE:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-Lt) + CcLt */		  GLchan Lt = texel[i][RCOMP], s = CHAN_MAX - Lt;		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, Lt);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, Lt);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, Lt);		  /* Av = Af */	       }	       break;	    case GL_LUMINANCE_ALPHA:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-Lt) + CcLt */		  GLchan Lt = texel[i][RCOMP], s = CHAN_MAX - Lt;		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, Lt);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, Lt);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, Lt);		  /* Av = AfAt */		  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP],texel[i][ACOMP]);	       }	       break;            case GL_INTENSITY:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-It) + CcIt */		  GLchan It = texel[i][RCOMP], s = CHAN_MAX - It;		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], s) + CHAN_PRODUCT(Rc, It);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], s) + CHAN_PRODUCT(Gc, It);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], s) + CHAN_PRODUCT(Bc, It);                  /* Av = Af(1-It) + Ac*It */                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], s) + CHAN_PRODUCT(Ac, It);               }               break;	    case GL_RGB:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-Ct) + CcCt */		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], (CHAN_MAX-texel[i][RCOMP])) + CHAN_PRODUCT(Rc,texel[i][RCOMP]);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], (CHAN_MAX-texel[i][GCOMP])) + CHAN_PRODUCT(Gc,texel[i][GCOMP]);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], (CHAN_MAX-texel[i][BCOMP])) + CHAN_PRODUCT(Bc,texel[i][BCOMP]);		  /* Av = Af */	       }	       break;	    case GL_RGBA:	       for (i=0;i<n;i++) {		  /* Cv = Cf(1-Ct) + CcCt */		  rgba[i][RCOMP] = CHAN_PRODUCT(rgba[i][RCOMP], (CHAN_MAX-texel[i][RCOMP])) + CHAN_PRODUCT(Rc,texel[i][RCOMP]);		  rgba[i][GCOMP] = CHAN_PRODUCT(rgba[i][GCOMP], (CHAN_MAX-texel[i][GCOMP])) + CHAN_PRODUCT(Gc,texel[i][GCOMP]);		  rgba[i][BCOMP] = CHAN_PRODUCT(rgba[i][BCOMP], (CHAN_MAX-texel[i][BCOMP])) + CHAN_PRODUCT(Bc,texel[i][BCOMP]);		  /* Av = AfAt */		  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP],texel[i][ACOMP]);	       }	       break;            default:               _mesa_problem(ctx, "Bad format (GL_BLEND) in texture_apply");               return;	 }	 break;     /* XXX don't clamp results if GLchan is float??? */      case GL_ADD:  /* GL_EXT_texture_add_env */         switch (format) {            case GL_ALPHA:               for (i=0;i<n;i++) {                  /* Rv = Rf */                  /* Gv = Gf */                  /* Bv = Bf */                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);               }               break;            case GL_LUMINANCE:               for (i=0;i<n;i++) {                  ChanTemp Lt = texel[i][RCOMP];                  ChanTemp r = rgba[i][RCOMP] + Lt;                  ChanTemp g = rgba[i][GCOMP] + Lt;                  ChanTemp b = rgba[i][BCOMP] + Lt;                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);                  /* Av = Af */               }               break;            case GL_LUMINANCE_ALPHA:               for (i=0;i<n;i++) {                  ChanTemp Lt = texel[i][RCOMP];                  ChanTemp r = rgba[i][RCOMP] + Lt;                  ChanTemp g = rgba[i][GCOMP] + Lt;                  ChanTemp b = rgba[i][BCOMP] + Lt;                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);               }               break;            case GL_INTENSITY:               for (i=0;i<n;i++) {                  GLchan It = texel[i][RCOMP];                  ChanTemp r = rgba[i][RCOMP] + It;                  ChanTemp g = rgba[i][GCOMP] + It;                  ChanTemp b = rgba[i][BCOMP] + It;                  ChanTemp a = rgba[i][ACOMP] + It;                  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);                  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);                  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);                  rgba[i][ACOMP] = MIN2(a, CHAN_MAX);               }               break;	    case GL_RGB:	       for (i=0;i<n;i++) {                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];		  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);		  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);		  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);		  /* Av = Af */	       }	       break;	    case GL_RGBA:	       for (i=0;i<n;i++) {                  ChanTemp r = rgba[i][RCOMP] + texel[i][RCOMP];                  ChanTemp g = rgba[i][GCOMP] + texel[i][GCOMP];                  ChanTemp b = rgba[i][BCOMP] + texel[i][BCOMP];		  rgba[i][RCOMP] = MIN2(r, CHAN_MAX);		  rgba[i][GCOMP] = MIN2(g, CHAN_MAX);		  rgba[i][BCOMP] = MIN2(b, CHAN_MAX);                  rgba[i][ACOMP] = CHAN_PRODUCT(rgba[i][ACOMP], texel[i][ACOMP]);               }               break;            default:               _mesa_problem(ctx, "Bad format (GL_ADD) in texture_apply");               return;	 }	 break;      default:         _mesa_problem(ctx, "Bad env mode in texture_apply");         return;   }}/** * Apply texture mapping to a span of fragments. */void_swrast_texture_span( GLcontext *ctx, SWspan *span ){   SWcontext *swrast = SWRAST_CONTEXT(ctx);   GLchan primary_rgba[MAX_WIDTH][4];   GLuint unit;   ASSERT(span->end < MAX_WIDTH);   /*    * Save copy of the incoming fragment colors (the GL_PRIMARY_COLOR)    */   if (swrast->_AnyTextureCombine)      MEMCPY(primary_rgba, span->array->rgba, 4 * span->end * sizeof(GLchan));   /*    * Must do all texture sampling before combining in order to    * accomodate GL_ARB_texture_env_crossbar.    */   for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {      if (ctx->Texture.Unit[unit]._ReallyEnabled) {         const GLfloat (*texcoords)[4]            = (const GLfloat (*)[4])            span->array->attribs[FRAG_ATTRIB_TEX0 + unit];         const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];         const struct gl_texture_object *curObj = texUnit->_Current;         GLfloat *lambda = span->array->lambda[unit];         GLchan (*texels)[4] = (GLchan (*)[4])            (swrast->TexelBuffer + unit * (span->end * 4 * sizeof(GLchan)));         /* adjust texture lod (lambda) */         if (span->arrayMask & SPAN_LAMBDA) {            if (texUnit->LodBias + curObj->LodBias != 0.0F) {               /* apply LOD bias, but don't clamp yet */               const GLfloat bias = CLAMP(texUnit->LodBias + curObj->LodBias,                                          -ctx->Const.MaxTextureLodBias,                                          ctx->Const.MaxTextureLodBias);               GLuint i;               for (i = 0; i < span->end; i++) {                  lambda[i] += bias;               }            }            if (curObj->MinLod != -1000.0 || curObj->MaxLod != 1000.0) {               /* apply LOD clamping to lambda */               const GLfloat min = curObj->MinLod;               const GLfloat max = curObj->MaxLod;               GLuint i;               for (i = 0; i < span->end; i++) {                  GLfloat l = lambda[i];                  lambda[i] = CLAMP(l, min, max);               }            }         }         /* Sample the texture (span->end = number of fragments) */         swrast->TextureSample[unit]( ctx, texUnit->_Current, span->end,                                      texcoords, lambda, texels );         /* GL_SGI_texture_color_table */         if (texUnit->ColorTableEnabled) {#if CHAN_TYPE == GL_UNSIGNED_BYTE            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);#elif CHAN_TYPE == GL_UNSIGNED_SHORT            _mesa_lookup_rgba_ubyte(&texUnit->ColorTable, span->end, texels);#else            _mesa_lookup_rgba_float(&texUnit->ColorTable, span->end, texels);#endif         }      }   }   /*    * OK, now apply the texture (aka texture combine/blend).    * We modify the span->color.rgba values.    */   for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {      if (ctx->Texture.Unit[unit]._ReallyEnabled) {         const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[unit];         if (texUnit->_CurrentCombine != &texUnit->_EnvMode ) {            texture_combine( ctx, unit, span->end,                             (CONST GLchan (*)[4]) primary_rgba,                             swrast->TexelBuffer,                             span->array->rgba );         }         else {            /* conventional texture blend */            const GLchan (*texels)[4] = (const GLchan (*)[4])               (swrast->TexelBuffer + unit *                (span->end * 4 * sizeof(GLchan)));            texture_apply( ctx, texUnit, span->end,                           (CONST GLchan (*)[4]) primary_rgba, texels,                           span->array->rgba );         }      }   }}

⌨️ 快捷键说明

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