Browse Source

Store the default shaders

Wilhem Barbier 7 years ago
parent
commit
7ef604fbf5
2 changed files with 62 additions and 81 deletions
  1. 13 15
      examples/shaders/shaders_postprocessing.c
  2. 49 66
      src/rlgl.c

+ 13 - 15
examples/shaders/shaders_postprocessing.c

@@ -20,10 +20,8 @@
 
 
 #if defined(PLATFORM_DESKTOP)
 #if defined(PLATFORM_DESKTOP)
     #define GLSL_VERSION            330
     #define GLSL_VERSION            330
-    #define DEFAULT_VERTEX_SHADER   "resources/shaders/glsl330/base.vs"
 #else   // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
 #else   // PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
     #define GLSL_VERSION            100
     #define GLSL_VERSION            100
-    #define DEFAULT_VERTEX_SHADER   "resources/shaders/glsl100/base.vs"
 #endif
 #endif
 
 
 #define MAX_POSTPRO_SHADERS         12
 #define MAX_POSTPRO_SHADERS         12
@@ -85,18 +83,18 @@ int main()
     // NOTE 2: We load the correct shader depending on GLSL version
     // NOTE 2: We load the correct shader depending on GLSL version
     Shader shaders[MAX_POSTPRO_SHADERS];
     Shader shaders[MAX_POSTPRO_SHADERS];
     
     
-    shaders[FX_GRAYSCALE] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/grayscale.fs", GLSL_VERSION));
-    shaders[FX_POSTERIZATION] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/posterization.fs", GLSL_VERSION));
-    shaders[FX_DREAM_VISION] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/dream_vision.fs", GLSL_VERSION));
-    shaders[FX_PIXELIZER] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/pixelizer.fs", GLSL_VERSION));
-    shaders[FX_CROSS_HATCHING] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/cross_hatching.fs", GLSL_VERSION));
-    shaders[FX_CROSS_STITCHING] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/cross_stitching.fs", GLSL_VERSION));
-    shaders[FX_PREDATOR_VIEW] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/predator.fs", GLSL_VERSION));
-    shaders[FX_SCANLINES] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/scanlines.fs", GLSL_VERSION));
-    shaders[FX_FISHEYE] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/fisheye.fs", GLSL_VERSION));
-    shaders[FX_SOBEL] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/sobel.fs", GLSL_VERSION));
-    shaders[FX_BLOOM] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/bloom.fs", GLSL_VERSION));
-    shaders[FX_BLUR] = LoadShader(DEFAULT_VERTEX_SHADER, FormatText("resources/shaders/glsl%i/blur.fs", GLSL_VERSION));
+    shaders[FX_GRAYSCALE] = LoadShader(0, FormatText("resources/shaders/glsl%i/grayscale.fs", GLSL_VERSION));
+    shaders[FX_POSTERIZATION] = LoadShader(0, FormatText("resources/shaders/glsl%i/posterization.fs", GLSL_VERSION));
+    shaders[FX_DREAM_VISION] = LoadShader(0, FormatText("resources/shaders/glsl%i/dream_vision.fs", GLSL_VERSION));
+    shaders[FX_PIXELIZER] = LoadShader(0, FormatText("resources/shaders/glsl%i/pixelizer.fs", GLSL_VERSION));
+    shaders[FX_CROSS_HATCHING] = LoadShader(0, FormatText("resources/shaders/glsl%i/cross_hatching.fs", GLSL_VERSION));
+    shaders[FX_CROSS_STITCHING] = LoadShader(0, FormatText("resources/shaders/glsl%i/cross_stitching.fs", GLSL_VERSION));
+    shaders[FX_PREDATOR_VIEW] = LoadShader(0, FormatText("resources/shaders/glsl%i/predator.fs", GLSL_VERSION));
+    shaders[FX_SCANLINES] = LoadShader(0, FormatText("resources/shaders/glsl%i/scanlines.fs", GLSL_VERSION));
+    shaders[FX_FISHEYE] = LoadShader(0, FormatText("resources/shaders/glsl%i/fisheye.fs", GLSL_VERSION));
+    shaders[FX_SOBEL] = LoadShader(0, FormatText("resources/shaders/glsl%i/sobel.fs", GLSL_VERSION));
+    shaders[FX_BLOOM] = LoadShader(0, FormatText("resources/shaders/glsl%i/bloom.fs", GLSL_VERSION));
+    shaders[FX_BLUR] = LoadShader(0, FormatText("resources/shaders/glsl%i/blur.fs", GLSL_VERSION));
     
     
     int currentShader = FX_GRAYSCALE;
     int currentShader = FX_GRAYSCALE;
 
 
@@ -177,4 +175,4 @@ int main()
     //--------------------------------------------------------------------------------------
     //--------------------------------------------------------------------------------------
 
 
     return 0;
     return 0;
-}
+}

+ 49 - 66
src/rlgl.c

@@ -267,6 +267,10 @@ static Vector3 *tempBuffer;
 static int tempBufferCount = 0;
 static int tempBufferCount = 0;
 static bool useTempBuffer = false;
 static bool useTempBuffer = false;
 
 
+// Shaders
+static unsigned int defaultVertexShader;
+static unsigned int defaultFragmentShader;
+
 // Shader Programs
 // Shader Programs
 static Shader defaultShader;                // Basic shader, support vertex color and diffuse texture
 static Shader defaultShader;                // Basic shader, support vertex color and diffuse texture
 static Shader currentShader;                // Shader to be used on rendering (by default, defaultShader)
 static Shader currentShader;                // Shader to be used on rendering (by default, defaultShader)
@@ -324,7 +328,8 @@ static int screenHeight;    // Default framebuffer height
 //----------------------------------------------------------------------------------
 //----------------------------------------------------------------------------------
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
 static void LoadTextureCompressed(unsigned char *data, int width, int height, int compressedFormat, int mipmapCount);
 static void LoadTextureCompressed(unsigned char *data, int width, int height, int compressedFormat, int mipmapCount);
-static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShaderStr);  // Load custom shader strings and return program id
+static unsigned int LoadShaderPartial(const char *shaderStr, int type);                 // Load custom shader and return shader id
+static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fragmentShader);  // Load custom shader strings and return program id
 
 
 static Shader LoadShaderDefault(void);      // Load default shader (just vertex positioning and texture coloring)
 static Shader LoadShaderDefault(void);      // Load default shader (just vertex positioning and texture coloring)
 static void SetShaderDefaultLocations(Shader *shader); // Bind default shader locations (attributes and uniforms)
 static void SetShaderDefaultLocations(Shader *shader); // Bind default shader locations (attributes and uniforms)
@@ -2359,22 +2364,33 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
     for (int i = 0; i < MAX_SHADER_LOCATIONS; i++) shader.locs[i] = -1;
     for (int i = 0; i < MAX_SHADER_LOCATIONS; i++) shader.locs[i] = -1;
 
 
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
 #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
-    // Shaders loading from external text file
-    char *vShaderStr = LoadText(vsFileName);
-    char *fShaderStr = LoadText(fsFileName);
-
-    if ((vShaderStr != NULL) && (fShaderStr != NULL))
-    {
-        shader.id = LoadShaderProgram(vShaderStr, fShaderStr);
 
 
-        // After shader loading, we TRY to set default location names
-        if (shader.id > 0) SetShaderDefaultLocations(&shader);
+    unsigned int vertexShader, fragmentShader;
 
 
-        // Shader strings must be freed
+    if (vsFileName == NULL) {
+        vertexShader = defaultVertexShader;
+    } else {
+        char *vShaderStr = LoadText(vsFileName);
+        vertexShader = LoadShaderPartial(vShaderStr, GL_VERTEX_SHADER);
         free(vShaderStr);
         free(vShaderStr);
+    }
+
+    if (fsFileName == NULL) {
+        fragmentShader = defaultVertexShader;
+    } else {
+        char* fShaderStr = LoadText(fsFileName);
+        fragmentShader = LoadShaderPartial(fShaderStr, GL_FRAGMENT_SHADER);
         free(fShaderStr);
         free(fShaderStr);
     }
     }
 
 
+    shader.id = LoadShaderProgram(vertexShader, fragmentShader);
+
+    // After shader loading, we TRY to set default location names
+    if (shader.id > 0) SetShaderDefaultLocations(&shader);
+
+    if (vertexShader != defaultVertexShader) glDeleteShader(vertexShader);
+    if (fragmentShader != defaultFragmentShader) glDeleteShader(fragmentShader);
+
     if (shader.id == 0)
     if (shader.id == 0)
     {
     {
         TraceLog(LOG_WARNING, "Custom shader could not be loaded");
         TraceLog(LOG_WARNING, "Custom shader could not be loaded");
@@ -3127,45 +3143,28 @@ static void LoadTextureCompressed(unsigned char *data, int width, int height, in
     }
     }
 }
 }
 
 
-// Load custom shader strings and return program id
-static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShaderStr)
+static unsigned int LoadShaderPartial(const char *shaderStr, int type)
 {
 {
-    unsigned int program = 0;
-
-#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
-    GLuint vertexShader;
-    GLuint fragmentShader;
-
-    vertexShader = glCreateShader(GL_VERTEX_SHADER);
-    fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
-
-    const char *pvs = vShaderStr;
-    const char *pfs = fShaderStr;
-
-    glShaderSource(vertexShader, 1, &pvs, NULL);
-    glShaderSource(fragmentShader, 1, &pfs, NULL);
+    unsigned int shader = glCreateShader(type);
+    glShaderSource(shader, 1, &shaderStr, NULL);
 
 
     GLint success = 0;
     GLint success = 0;
-
-    glCompileShader(vertexShader);
-
-    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
+    glCompileShader(shader);
+    glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
 
 
     if (success != GL_TRUE)
     if (success != GL_TRUE)
     {
     {
-        TraceLog(LOG_WARNING, "[VSHDR ID %i] Failed to compile vertex shader...", vertexShader);
-
+        TraceLog(LOG_WARNING, "[VSHDR ID %i] Failed to compile shader...", shader);
         int maxLength = 0;
         int maxLength = 0;
         int length;
         int length;
-
-        glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &maxLength);
+        glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
 
 
 #ifdef _MSC_VER
 #ifdef _MSC_VER
         char *log = malloc(maxLength);
         char *log = malloc(maxLength);
 #else
 #else
         char log[maxLength];
         char log[maxLength];
 #endif
 #endif
-        glGetShaderInfoLog(vertexShader, maxLength, &length, log);
+        glGetShaderInfoLog(shader, maxLength, &length, log);
 
 
         TraceLog(LOG_INFO, "%s", log);
         TraceLog(LOG_INFO, "%s", log);
 
 
@@ -3173,36 +3172,19 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade
         free(log);
         free(log);
 #endif
 #endif
     }
     }
-    else TraceLog(LOG_INFO, "[VSHDR ID %i] Vertex shader compiled successfully", vertexShader);
-
-    glCompileShader(fragmentShader);
-
-    glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &success);
-
-    if (success != GL_TRUE)
-    {
-        TraceLog(LOG_WARNING, "[FSHDR ID %i] Failed to compile fragment shader...", fragmentShader);
-
-        int maxLength = 0;
-        int length;
-
-        glGetShaderiv(fragmentShader, GL_INFO_LOG_LENGTH, &maxLength);
+    else TraceLog(LOG_INFO, "[VSHDR ID %i] Shader compiled successfully", shader);
 
 
-#ifdef _MSC_VER
-        char *log = malloc(maxLength);
-#else
-        char log[maxLength];
-#endif
-        glGetShaderInfoLog(fragmentShader, maxLength, &length, log);
+    return shader;
+}
 
 
-        TraceLog(LOG_INFO, "%s", log);
+// Load custom shader strings and return program id
+static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fragmentShader)
+{
+    unsigned int program = 0;
 
 
-#ifdef _MSC_VER
-        free(log);
-#endif
-    }
-    else TraceLog(LOG_INFO, "[FSHDR ID %i] Fragment shader compiled successfully", fragmentShader);
+#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
 
 
+    GLint success = 0;
     program = glCreateProgram();
     program = glCreateProgram();
 
 
     glAttachShader(program, vertexShader);
     glAttachShader(program, vertexShader);
@@ -3250,9 +3232,6 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade
         program = 0;
         program = 0;
     }
     }
     else TraceLog(LOG_INFO, "[SHDR ID %i] Shader program loaded successfully", program);
     else TraceLog(LOG_INFO, "[SHDR ID %i] Shader program loaded successfully", program);
-
-    glDeleteShader(vertexShader);
-    glDeleteShader(fragmentShader);
 #endif
 #endif
     return program;
     return program;
 }
 }
@@ -3326,7 +3305,9 @@ static Shader LoadShaderDefault(void)
 #endif
 #endif
     "}                                  \n";
     "}                                  \n";
 
 
-    shader.id = LoadShaderProgram(vDefaultShaderStr, fDefaultShaderStr);
+    defaultVertexShader = LoadShaderPartial(vDefaultShaderStr, GL_VERTEX_SHADER);
+    defaultFragmentShader = LoadShaderPartial(fDefaultShaderStr, GL_FRAGMENT_SHADER);
+    shader.id = LoadShaderProgram(defaultVertexShader, defaultFragmentShader);
 
 
     if (shader.id > 0) 
     if (shader.id > 0) 
     {
     {
@@ -3388,6 +3369,8 @@ static void UnloadShaderDefault(void)
 {
 {
     glUseProgram(0);
     glUseProgram(0);
 
 
+    glDeleteShader(defaultVertexShader);
+    glDeleteShader(defaultFragmentShader);
     //glDetachShader(defaultShader, vertexShader);
     //glDetachShader(defaultShader, vertexShader);
     //glDetachShader(defaultShader, fragmentShader);
     //glDetachShader(defaultShader, fragmentShader);
     //glDeleteShader(vertexShader);     // Already deleted on shader compilation
     //glDeleteShader(vertexShader);     // Already deleted on shader compilation