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

📄 s_texcombine.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 3 页
字号:
      case GL_DOT3_RGB_EXT:      case GL_DOT3_RGBA_EXT:         {            /* Do not scale the result by 1 2 or 4 */            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               GLchan dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +                             (arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +                             (arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))                            * 4.0F;               dot = CLAMP(dot, 0.0F, CHAN_MAXF);#else               GLint dot = (S_PROD((GLint)arg0[i][RCOMP] - half,				   (GLint)arg1[i][RCOMP] - half) +			    S_PROD((GLint)arg0[i][GCOMP] - half,				   (GLint)arg1[i][GCOMP] - half) +			    S_PROD((GLint)arg0[i][BCOMP] - half,				   (GLint)arg1[i][BCOMP] - half)) >> 6;               dot = CLAMP(dot, 0, CHAN_MAX);#endif               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLchan) dot;            }         }         break;      case GL_DOT3_RGB:      case GL_DOT3_RGBA:         {            /* DO scale the result by 1 2 or 4 */            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               GLchan dot = ((arg0[i][RCOMP]-0.5F) * (arg1[i][RCOMP]-0.5F) +                             (arg0[i][GCOMP]-0.5F) * (arg1[i][GCOMP]-0.5F) +                             (arg0[i][BCOMP]-0.5F) * (arg1[i][BCOMP]-0.5F))                            * 4.0F * RGBmult;               dot = CLAMP(dot, 0.0, CHAN_MAXF);#else               GLint dot = (S_PROD((GLint)arg0[i][RCOMP] - half,				   (GLint)arg1[i][RCOMP] - half) +			    S_PROD((GLint)arg0[i][GCOMP] - half,				   (GLint)arg1[i][GCOMP] - half) +			    S_PROD((GLint)arg0[i][BCOMP] - half,				   (GLint)arg1[i][BCOMP] - half)) >> 6;               dot <<= RGBshift;               dot = CLAMP(dot, 0, CHAN_MAX);#endif               rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = (GLchan) dot;            }         }         break;      case GL_MODULATE_ADD_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - RGBshift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) + arg1[i][RCOMP]) * RGBmult;               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) + arg1[i][GCOMP]) * RGBmult;               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) + arg1[i][BCOMP]) * RGBmult;#else               GLuint r = (PROD(arg0[i][RCOMP], arg2[i][RCOMP])                           + ((GLuint) arg1[i][RCOMP] << CHAN_BITS)) >> shift;               GLuint g = (PROD(arg0[i][GCOMP], arg2[i][GCOMP])                           + ((GLuint) arg1[i][GCOMP] << CHAN_BITS)) >> shift;               GLuint b = (PROD(arg0[i][BCOMP], arg2[i][BCOMP])                           + ((GLuint) arg1[i][BCOMP] << CHAN_BITS)) >> shift;               rgba[i][RCOMP] = (GLchan) MIN2(r, CHAN_MAX);               rgba[i][GCOMP] = (GLchan) MIN2(g, CHAN_MAX);               rgba[i][BCOMP] = (GLchan) MIN2(b, CHAN_MAX);#endif            }	 }         break;      case GL_MODULATE_SIGNED_ADD_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - RGBshift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) + arg1[i][RCOMP] - 0.5) * RGBmult;               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) + arg1[i][GCOMP] - 0.5) * RGBmult;               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) + arg1[i][BCOMP] - 0.5) * RGBmult;#else               GLint r = (S_PROD(arg0[i][RCOMP], arg2[i][RCOMP])			  + (((GLint) arg1[i][RCOMP] - half) << CHAN_BITS))		    >> shift;               GLint g = (S_PROD(arg0[i][GCOMP], arg2[i][GCOMP])			  + (((GLint) arg1[i][GCOMP] - half) << CHAN_BITS))		    >> shift;               GLint b = (S_PROD(arg0[i][BCOMP], arg2[i][BCOMP])			  + (((GLint) arg1[i][BCOMP] - half) << CHAN_BITS))		    >> shift;               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);#endif            }	 }         break;      case GL_MODULATE_SUBTRACT_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argRGB[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argRGB[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argRGB[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - RGBshift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][RCOMP] = ((arg0[i][RCOMP] * arg2[i][RCOMP]) - arg1[i][RCOMP]) * RGBmult;               rgba[i][GCOMP] = ((arg0[i][GCOMP] * arg2[i][GCOMP]) - arg1[i][GCOMP]) * RGBmult;               rgba[i][BCOMP] = ((arg0[i][BCOMP] * arg2[i][BCOMP]) - arg1[i][BCOMP]) * RGBmult;#else               GLint r = (S_PROD(arg0[i][RCOMP], arg2[i][RCOMP])			  - ((GLint) arg1[i][RCOMP] << CHAN_BITS))		    >> shift;               GLint g = (S_PROD(arg0[i][GCOMP], arg2[i][GCOMP])			  - ((GLint) arg1[i][GCOMP] << CHAN_BITS))		    >> shift;               GLint b = (S_PROD(arg0[i][BCOMP], arg2[i][BCOMP])			  - ((GLint) arg1[i][BCOMP] << CHAN_BITS))		    >> shift;               rgba[i][RCOMP] = (GLchan) CLAMP(r, 0, CHAN_MAX);               rgba[i][GCOMP] = (GLchan) CLAMP(g, 0, CHAN_MAX);               rgba[i][BCOMP] = (GLchan) CLAMP(b, 0, CHAN_MAX);#endif            }	 }         break;      default:         _mesa_problem(ctx, "invalid combine mode");   }   switch (textureUnit->_CurrentCombine->ModeA) {      case GL_REPLACE:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            if (Ashift) {               for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT                  GLchan a = arg0[i][ACOMP] * Amult;#else                  GLuint a = (GLuint) arg0[i][ACOMP] << Ashift;#endif                  rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);               }            }            else {               for (i = 0; i < n; i++) {                  rgba[i][ACOMP] = arg0[i][ACOMP];               }            }         }         break;      case GL_MODULATE:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - Ashift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = arg0[i][ACOMP] * arg1[i][ACOMP] * Amult;#else               GLuint a = (PROD(arg0[i][ACOMP], arg1[i][ACOMP]) >> shift);               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);#endif            }         }         break;      case GL_ADD:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan  (*arg1)[4] = (const GLchan (*)[4]) argA[1];            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP]) * Amult;#else               GLint a = ((GLint) arg0[i][ACOMP] + arg1[i][ACOMP]) << Ashift;               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);#endif            }         }         break;      case GL_ADD_SIGNED:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = (arg0[i][ACOMP] + arg1[i][ACOMP] - 0.5F) * Amult;#else               GLint a = (GLint) arg0[i][ACOMP] + (GLint) arg1[i][ACOMP] -half;               a = (a < 0) ? 0 : a << Ashift;               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);#endif            }         }         break;      case GL_INTERPOLATE:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - Ashift;#endif            for (i=0; i<n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = (arg0[i][ACOMP] * arg2[i][ACOMP] +                                 arg1[i][ACOMP] * (CHAN_MAXF - arg2[i][ACOMP]))                                * Amult;#else               GLuint a = (PROD(arg0[i][ACOMP], arg2[i][ACOMP])                           + PROD(arg1[i][ACOMP], CHAN_MAX - arg2[i][ACOMP]))                              >> shift;               rgba[i][ACOMP] = (GLchan) MIN2(a, CHAN_MAX);#endif            }         }         break;      case GL_SUBTRACT:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = (arg0[i][ACOMP] - arg1[i][ACOMP]) * Amult;#else               GLint a = ((GLint) arg0[i][ACOMP] - (GLint) arg1[i][ACOMP]) << Ashift;               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);#endif            }         }         break;      case GL_MODULATE_ADD_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - Ashift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) + arg1[i][ACOMP]) * Amult;#else               GLint a = (PROD(arg0[i][ACOMP], arg2[i][ACOMP])			   + ((GLuint) arg1[i][ACOMP] << CHAN_BITS))		    >> shift;               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);#endif            }         }         break;      case GL_MODULATE_SIGNED_ADD_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - Ashift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) + arg1[i][ACOMP] - 0.5F) * Amult;#else               GLint a = (S_PROD(arg0[i][ACOMP], arg2[i][ACOMP])			  + (((GLint) arg1[i][ACOMP] - half) << CHAN_BITS))		    >> shift;               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);#endif            }         }         break;      case GL_MODULATE_SUBTRACT_ATI:         {            const GLchan (*arg0)[4] = (const GLchan (*)[4]) argA[0];            const GLchan (*arg1)[4] = (const GLchan (*)[4]) argA[1];            const GLchan (*arg2)[4] = (const GLchan (*)[4]) argA[2];#if CHAN_TYPE != GL_FLOAT            const GLint shift = CHAN_BITS - Ashift;#endif            for (i = 0; i < n; i++) {#if CHAN_TYPE == GL_FLOAT               rgba[i][ACOMP] = ((arg0[i][ACOMP] * arg2[i][ACOMP]) - arg1[i][ACOMP]) * Amult;#else               GLint a = (S_PROD(arg0[i][ACOMP], arg2[i][ACOMP]) 			  - ((GLint) arg1[i][ACOMP] << CHAN_BITS))		    >> shift;               rgba[i][ACOMP] = (GLchan) CLAMP(a, 0, CHAN_MAX);#endif            }         }         break;      default:         _mesa_problem(ctx, "invalid combine mode");   }   /* Fix the alpha component for GL_DOT3_RGBA_EXT/ARB combining.    * This is kind of a kludge.  It would have been better if the spec    * were written such that the GL_COMBINE_ALPHA value could be set to    * GL_DOT3.    */   if (textureUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA_EXT ||       textureUnit->_CurrentCombine->ModeRGB == GL_DOT3_RGBA) {      for (i = 0; i < n; i++) {	 rgba[i][ACOMP] = rgba[i][RCOMP];      }   }}#undef PROD/** * Apply a conventional OpenGL texture env mode (REPLACE, ADD, BLEND, * MODULATE, or DECAL) to an array of fragments. * Input:  textureUnit - pointer to texture unit to apply *         format - base internal texture format *         n - number of fragments *         primary_rgba - primary colors (may alias rgba for single texture) *         texels - array of texel colors * InOut:  rgba - incoming fragment colors modified by texel colors *                according to the texture environment mode. */static voidtexture_apply( const GLcontext *ctx,               const struct gl_texture_unit *texUnit,               GLuint n,               CONST GLchan primary_rgba[][4], CONST GLchan texel[][4],               GLchan rgba[][4] ){   GLint baseLevel;   GLuint i;   GLchan Rc, Gc, Bc, Ac;   GLenum format;   (void) primary_rgba;   ASSERT(texUnit);   ASSERT(texUnit->_Current);   baseLevel = texUnit->_Current->BaseLevel;   ASSERT(texUnit->_Current->Image[0][baseLevel]);   format = texUnit->_Current->Image[0][baseLevel]->_BaseFormat;   if (format == GL_COLOR_INDEX || format == GL_YCBCR_MESA) {      format = GL_RGBA;  /* a bit of a hack */   }   else if (format == GL_DEPTH_COMPONENT || format == GL_DEPTH_STENCIL_EXT) {      format = texUnit->_Current->DepthMode;   }   switch (texUnit->EnvMode) {      case GL_REPLACE:	 switch (format) {	    case GL_ALPHA:	       for (i=0;i<n;i++) {		  /* Cv = Cf */                  /* Av = At */                  rgba[i][ACOMP] = texel[i][ACOMP];	       }	       break;	    case GL_LUMINANCE:	       for (i=0;i<n;i++) {		  /* Cv = Lt */                  GLchan Lt = texel[i][RCOMP];                  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = Lt;                  /* Av = Af */	       }	       break;	    case GL_LUMINANCE_ALPHA:	       for (i=0;i<n;i++) {                  GLchan Lt = texel[i][RCOMP];		  /* Cv = Lt */		  rgba[i][RCOMP] = rgba[i][GCOMP] = rgba[i][BCOMP] = Lt;		  /* Av = At */		  rgba[i][ACOMP] = texel[i][ACOMP];	       }

⌨️ 快捷键说明

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