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