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