浏览代码

Multiple blendmodes (#1324)

Co-authored-by: max <[email protected]>
cedemax 5 年之前
父节点
当前提交
bfafb80cde
共有 2 个文件被更改,包括 31 次插入13 次删除
  1. 4 1
      src/raylib.h
  2. 27 12
      src/rlgl.h

+ 4 - 1
src/raylib.h

@@ -808,7 +808,8 @@ typedef enum {
     BLEND_ALPHA = 0,        // Blend textures considering alpha (default)
     BLEND_ADDITIVE,         // Blend textures adding colors
     BLEND_MULTIPLIED,       // Blend textures multiplying colors
-    BLEND_ADD_COLORS        // Blend textures adding colors (alternative)
+    BLEND_ADD_COLORS,        // Blend textures adding colors (alternative)
+    BLEND_SUBTRACT_COLORS        // Blend textures subtracting colors (alternative)
 } BlendMode;
 
 // Gestures type
@@ -1390,8 +1391,10 @@ RLAPI Texture2D GenTextureBRDF(Shader shader, int size);                  // Gen
 RLAPI void BeginShaderMode(Shader shader);                                // Begin custom shader drawing
 RLAPI void EndShaderMode(void);                                           // End custom shader drawing (use default shader)
 RLAPI void BeginBlendMode(int mode);                                      // Begin blending mode (alpha, additive, multiplied)
+RLAPI void BeginBlendModeEx(int sFactor, int dFactor, int equation);      // Begin blending mode (full options)
 RLAPI void EndBlendMode(void);                                            // End blending mode (reset to default: alpha blending)
 
+
 // VR control functions
 RLAPI void InitVrSimulator(void);                       // Init VR simulator for selected device parameters
 RLAPI void CloseVrSimulator(void);                      // Close VR simulator for current device

+ 27 - 12
src/rlgl.h

@@ -589,6 +589,7 @@ RLAPI Texture2D GenTextureBRDF(Shader shader, int size);                  // Gen
 RLAPI void BeginShaderMode(Shader shader);              // Begin custom shader drawing
 RLAPI void EndShaderMode(void);                         // End custom shader drawing (use default shader)
 RLAPI void BeginBlendMode(int mode);                    // Begin blending mode (alpha, additive, multiplied)
+RLAPI void BeginBlendModeEx(int sFactor, int dFactor, int equation);    // Begin blending mode (full options)
 RLAPI void EndBlendMode(void);                          // End blending mode (reset to default: alpha blending)
 
 // VR control functions
@@ -3608,26 +3609,40 @@ Texture2D GenTextureBRDF(Shader shader, int size)
     return brdf;
 }
 
+
+void BeginBlendModeEx(int sFactor, int dFactor, int equation)
+{
+    static int glSFactor = 0;   // Track current blending mode
+    static int glDFactor = 0;   // Track current blending mode
+    static int glEquation = 0;   // Track current blending mode
+
+    if (glSFactor != sFactor || glDFactor != dFactor || glEquation != equation) {
+
+        rlglDraw();
+        glBlendFunc(sFactor, dFactor);
+        glBlendEquation(equation);
+
+        glSFactor = sFactor;
+        glDFactor = dFactor;
+        glEquation = equation;
+    }
+}
+
 // Begin blending mode (alpha, additive, multiplied)
 // NOTE: Only 3 blending modes supported, default blend mode is alpha
 void BeginBlendMode(int mode)
 {
-    static int blendMode = 0;   // Track current blending mode
-
-    if ((blendMode != mode) && (mode < 4))
+    if (mode < 5)
     {
-        rlglDraw();
-
         switch (mode)
         {
-            case BLEND_ALPHA: glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); break;
-            case BLEND_ADDITIVE: glBlendFunc(GL_SRC_ALPHA, GL_ONE); break;
-            case BLEND_MULTIPLIED: glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA); break;
-            case BLEND_ADD_COLORS: glBlendFunc(GL_ONE, GL_ONE); break;
-            default: break;
+        case BLEND_ALPHA: BeginBlendModeEx(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD); break;
+        case BLEND_ADDITIVE: BeginBlendModeEx(GL_SRC_ALPHA, GL_ONE, GL_FUNC_ADD); break;
+        case BLEND_MULTIPLIED: BeginBlendModeEx(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA, GL_FUNC_ADD); break;
+        case BLEND_ADD_COLORS: BeginBlendModeEx(GL_ONE, GL_ONE, GL_FUNC_ADD); break;
+        case BLEND_SUBTRACT_COLORS: BeginBlendModeEx(GL_ONE, GL_ONE, GL_FUNC_SUBTRACT); break;
+        default: break;
         }
-
-        blendMode = mode;
     }
 }