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

📄 tdfx_texstate.c

📁 Mesa is an open-source implementation of the OpenGL specification - a system for rendering interacti
💻 C
📖 第 1 页 / 共 5 页
字号:
            env->Color.SourceC = GR_CMBX_ZERO;            env->Color.InvertC = FXTRUE;            env->Color.SourceD = GR_CMBX_ZERO;            env->Color.InvertD = FXFALSE;        }        else {            /* Rv = Rf * (1 - Rt) + Rc * Rt */            env->Color.SourceA = GR_CMBX_TMU_CCOLOR;            env->Color.ModeA = GR_FUNC_MODE_X;            env->Color.SourceB = incomingRGB;            env->Color.ModeB = GR_FUNC_MODE_NEGATIVE_X;            env->Color.SourceC = GR_CMBX_LOCAL_TEXTURE_RGB;            env->Color.InvertC = FXFALSE;            env->Color.SourceD = GR_CMBX_B;            env->Color.InvertD = FXFALSE;        }        /* -- Setup Alpha combiner */        if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {            /* Av = Af */            env->Alpha.SourceA = incomingAlpha;            env->Alpha.ModeA = GR_FUNC_MODE_X;            env->Alpha.SourceB = GR_CMBX_ZERO;            env->Alpha.ModeB = GR_FUNC_MODE_ZERO;            env->Alpha.SourceC = GR_CMBX_ZERO;            env->Alpha.InvertC = FXTRUE;            env->Alpha.SourceD = GR_CMBX_ZERO;            env->Alpha.InvertD = FXFALSE;        }        else if (baseFormat == GL_INTENSITY) {            /* Av = Af * (1 - It) + Ac * It */            env->Alpha.SourceA = GR_CMBX_TMU_CALPHA;            env->Alpha.ModeA = GR_FUNC_MODE_X;            env->Alpha.SourceB = incomingAlpha;            env->Alpha.ModeB = GR_FUNC_MODE_NEGATIVE_X;            env->Alpha.SourceC = GR_CMBX_LOCAL_TEXTURE_ALPHA;            env->Alpha.InvertC = FXFALSE;            env->Alpha.SourceD = GR_CMBX_B;            env->Alpha.InvertD = FXFALSE;        }        else {            /* Av = Af * At */            env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;            env->Alpha.ModeA = GR_FUNC_MODE_X;            env->Alpha.SourceB = GR_CMBX_ITALPHA;            env->Alpha.ModeB = GR_FUNC_MODE_ZERO;            env->Alpha.SourceC = incomingAlpha;            env->Alpha.InvertC = FXFALSE;            env->Alpha.SourceD = GR_CMBX_ZERO;            env->Alpha.InvertD = FXFALSE;        }        /* Also have to set up the tex env constant color */        env->EnvColor = PACK_RGBA32(texUnit->EnvColor[0] * 255.0F,                                    texUnit->EnvColor[1] * 255.0F,                                    texUnit->EnvColor[2] * 255.0F,                                    texUnit->EnvColor[3] * 255.0F);        break;    case GL_ADD:        /* -- Setup RGB combiner */        if (baseFormat == GL_ALPHA) {            /* Rv = Rf */           env->Color.SourceB = GR_CMBX_ZERO;           env->Color.ModeB = GR_FUNC_MODE_ZERO;        }        else {            /* Rv = Rf + Tt */           env->Color.SourceB = GR_CMBX_LOCAL_TEXTURE_RGB;           env->Color.ModeB = GR_FUNC_MODE_X;        }        env->Color.SourceA = incomingRGB;        env->Color.ModeA = GR_FUNC_MODE_X;        env->Color.SourceC = GR_CMBX_ZERO;        env->Color.InvertC = FXTRUE;        env->Color.SourceD = GR_CMBX_ZERO;        env->Color.InvertD = FXFALSE;        /* -- Setup Alpha combiner */        if (baseFormat == GL_LUMINANCE || baseFormat == GL_RGB) {            /* Av = Af */           env->Alpha.SourceA = incomingAlpha;           env->Alpha.SourceB = GR_CMBX_ITALPHA;           env->Alpha.ModeB = GR_FUNC_MODE_ZERO;           env->Alpha.SourceC = GR_CMBX_ZERO;           env->Alpha.InvertC = FXTRUE;        }        else if (baseFormat == GL_INTENSITY) {            /* Av = Af + It */           env->Alpha.SourceA = incomingAlpha;           env->Alpha.SourceB = GR_CMBX_LOCAL_TEXTURE_ALPHA;           env->Alpha.ModeB = GR_FUNC_MODE_X;           env->Alpha.SourceC = GR_CMBX_ZERO;           env->Alpha.InvertC = FXTRUE;        }        else {            /* Av = Af * At */           env->Alpha.SourceA = GR_CMBX_LOCAL_TEXTURE_ALPHA;           env->Alpha.SourceB = GR_CMBX_ITALPHA;           env->Alpha.ModeB = GR_FUNC_MODE_ZERO;           env->Alpha.SourceC = incomingAlpha;           env->Alpha.InvertC = FXFALSE;        }        env->Alpha.ModeA = GR_FUNC_MODE_X;        env->Alpha.SourceD = GR_CMBX_ZERO;        env->Alpha.InvertD = FXFALSE;        break;    case GL_COMBINE_EXT:        {            FxU32 A_RGB, B_RGB, C_RGB, D_RGB;            FxU32 Amode_RGB, Bmode_RGB;            FxBool Cinv_RGB, Dinv_RGB, Ginv_RGB;            FxU32 Shift_RGB;            FxU32 A_A, B_A, C_A, D_A;            FxU32 Amode_A, Bmode_A;            FxBool Cinv_A, Dinv_A, Ginv_A;            FxU32 Shift_A;           /*            *            * In the formulas below, we write:            *  o "1(x)" for the identity function applied to x,            *    so 1(x) = x.            *  o "0(x)" for the constant function 0, so            *    0(x) = 0 for all values of x.            *            * Calculate the color combination.            */            Shift_RGB = texUnit->Combine.ScaleShiftRGB;            Shift_A = texUnit->Combine.ScaleShiftA;            switch (texUnit->Combine.ModeRGB) {            case GL_REPLACE:               /*                * The formula is: Arg0                * We implement this by the formula:                *   (Arg0 + 0(0))*(1-0) + 0                */                TEXENV_SETUP_ARG_RGB(A_RGB,                                     texUnit->Combine.SourceRGB[0],                                     texUnit->Combine.OperandRGB[0],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_MODE_RGB(Amode_RGB,                                      texUnit->Combine.OperandRGB[0]);                B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;                Bmode_RGB = GR_FUNC_MODE_ZERO;                Cinv_RGB = FXTRUE;                Dinv_RGB = Ginv_RGB = FXFALSE;                break;            case GL_MODULATE:               /*                * The formula is: Arg0 * Arg1                *                * We implement this by the formula                *   (Arg0 + 0(0)) * Arg1 + 0(0)                */                TEXENV_SETUP_ARG_RGB(A_RGB,                                     texUnit->Combine.SourceRGB[0],                                     texUnit->Combine.OperandRGB[0],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_MODE_RGB(Amode_RGB,                                      texUnit->Combine.OperandRGB[0]);                B_RGB = GR_CMBX_ZERO;                Bmode_RGB = GR_CMBX_ZERO;                TEXENV_SETUP_ARG_RGB(C_RGB,                                     texUnit->Combine.SourceRGB[1],                                     texUnit->Combine.OperandRGB[1],                                     incomingRGB, incomingAlpha);                Cinv_RGB = TEXENV_OPERAND_INVERTED                               (texUnit->Combine.OperandRGB[1]);                D_RGB = GR_CMBX_ZERO;                Dinv_RGB = Ginv_RGB = FXFALSE;                break;            case GL_ADD:               /*                * The formula is Arg0 + Arg1                */                TEXENV_SETUP_ARG_RGB(A_RGB,                                     texUnit->Combine.SourceRGB[0],                                     texUnit->Combine.OperandRGB[0],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_MODE_RGB(Amode_RGB,                                      texUnit->Combine.OperandRGB[0]);                TEXENV_SETUP_ARG_RGB(B_RGB,                                     texUnit->Combine.SourceRGB[1],                                     texUnit->Combine.OperandRGB[1],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_MODE_RGB(Bmode_RGB,                                      texUnit->Combine.OperandRGB[1]);                C_RGB = D_RGB = GR_CMBX_ZERO;                Cinv_RGB = FXTRUE;                Dinv_RGB = Ginv_RGB = FXFALSE;                break;            case GL_ADD_SIGNED_EXT:               /*                * The formula is: Arg0 + Arg1 - 0.5.                * We compute this by calculating:                *      (Arg0 - 1/2) + Arg1         if op0 is SRC_{COLOR,ALPHA}                *      Arg0 + (Arg1 - 1/2)         if op1 is SRC_{COLOR,ALPHA}                * If both op0 and op1 are ONE_MINUS_SRC_{COLOR,ALPHA}                * we cannot implement the formula properly.                */                TEXENV_SETUP_ARG_RGB(A_RGB,                                     texUnit->Combine.SourceRGB[0],                                     texUnit->Combine.OperandRGB[0],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_ARG_RGB(B_RGB,                                     texUnit->Combine.SourceRGB[1],                                     texUnit->Combine.OperandRGB[1],                                     incomingRGB, incomingAlpha);                if (!TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[0])) {                   /*                    * A is not inverted.  So, choose it.                    */                    Amode_RGB = GR_FUNC_MODE_X_MINUS_HALF;                    if (!TEXENV_OPERAND_INVERTED                            (texUnit->Combine.OperandRGB[1])) {                        Bmode_RGB = GR_FUNC_MODE_X;                    }                    else {                        Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;                    }                }                else {                   /*                    * A is inverted, so try to subtract 1/2                    * from B.                    */                    Amode_RGB = GR_FUNC_MODE_ONE_MINUS_X;                    if (!TEXENV_OPERAND_INVERTED                            (texUnit->Combine.OperandRGB[1])) {                        Bmode_RGB = GR_FUNC_MODE_X_MINUS_HALF;                    }                    else {                       /*                        * Both are inverted.  This is the case                        * we cannot handle properly.  We just                        * choose to not add the - 1/2.                        */                        Bmode_RGB = GR_FUNC_MODE_ONE_MINUS_X;                        return GL_FALSE;                    }                }                C_RGB = D_RGB = GR_CMBX_ZERO;                Cinv_RGB = FXTRUE;                Dinv_RGB = Ginv_RGB = FXFALSE;                break;            case GL_INTERPOLATE_EXT:               /*                * The formula is: Arg0 * Arg2 + Arg1 * (1 - Arg2).                * We compute this by the formula:                *            (Arg0 - Arg1) * Arg2 + Arg1                *               == Arg0 * Arg2 - Arg1 * Arg2 + Arg1                *               == Arg0 * Arg2 + Arg1 * (1 - Arg2)                * However, if both Arg1 is ONE_MINUS_X, the HW does                * not support it properly.                */                TEXENV_SETUP_ARG_RGB(A_RGB,                                     texUnit->Combine.SourceRGB[0],                                     texUnit->Combine.OperandRGB[0],                                     incomingRGB, incomingAlpha);                TEXENV_SETUP_MODE_RGB(Amode_RGB,                                      texUnit->Combine.OperandRGB[0]);                TEXENV_SETUP_ARG_RGB(B_RGB,                                     texUnit->Combine.SourceRGB[1],                                     texUnit->Combine.OperandRGB[1],                                     incomingRGB, incomingAlpha);                if (TEXENV_OPERAND_INVERTED(texUnit->Combine.OperandRGB[1])) {                   /*                    * This case is wrong.                    */                   Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;                   return GL_FALSE;                }                else {                    Bmode_RGB = GR_FUNC_MODE_NEGATIVE_X;                }               /*                * The Source/Operand for the C value must                * specify some kind of alpha value.                */                TEXENV_SETUP_ARG_A(C_RGB,                                   texUnit->Combine.SourceRGB[2],                                   texUnit->Combine.OperandRGB[2],                                   incomingAlpha);                Cinv_RGB = FXFALSE;                D_RGB = GR_CMBX_B;                Dinv_RGB = Ginv_RGB = FXFALSE;                break;            default:               /*                * This is here mostly to keep from getting                * a compiler warning about these not being set.                * However, this should set all the texture values                * to zero.                */                A_RGB = B_RGB = C_RGB = D_RGB = GR_CMBX_ZERO;                Amode_RGB = Bmode_RGB = GR_FUNC_MODE_X;                Cinv_RGB = Dinv_RGB = Ginv_RGB = FXFALSE;                break;            }           /*            * Calculate the alpha combination.            */            switch (texUnit->Combine.ModeA) {            case GL_REPLACE:

⌨️ 快捷键说明

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