aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRay <raysan5@gmail.com>2017-11-10 12:10:49 +0100
committerGitHub <noreply@github.com>2017-11-10 12:10:49 +0100
commite12182f59b4c84bb3c941b02ae4253de645fdf4d (patch)
treec89363ac6eeb3c7d10cff2c8b7329993d6a7f0c8 /src
parent0eb222bda163fab2e70ac0b2dbe27547e490c46c (diff)
parent7ef604fbf5c3ba03d72b1559656e209f929e442d (diff)
downloadraylib-e12182f59b4c84bb3c941b02ae4253de645fdf4d.tar.gz
raylib-e12182f59b4c84bb3c941b02ae4253de645fdf4d.zip
Merge pull request #384 from nounoursheureux/develop
Store the default shaders
Diffstat (limited to 'src')
-rw-r--r--src/rlgl.c115
1 files changed, 49 insertions, 66 deletions
diff --git a/src/rlgl.c b/src/rlgl.c
index 2dd5c544..c5c9493d 100644
--- a/src/rlgl.c
+++ b/src/rlgl.c
@@ -267,6 +267,10 @@ static Vector3 *tempBuffer;
static int tempBufferCount = 0;
static bool useTempBuffer = false;
+// Shaders
+static unsigned int defaultVertexShader;
+static unsigned int defaultFragmentShader;
+
// Shader Programs
static Shader defaultShader; // Basic shader, support vertex color and diffuse texture
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)
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 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;
#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);
+ }
+
+ if (fsFileName == NULL) {
+ fragmentShader = defaultVertexShader;
+ } else {
+ char* fShaderStr = LoadText(fsFileName);
+ fragmentShader = LoadShaderPartial(fShaderStr, GL_FRAGMENT_SHADER);
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)
{
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;
-
- glCompileShader(vertexShader);
-
- glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);
+ glCompileShader(shader);
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &success);
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 length;
-
- glGetShaderiv(vertexShader, GL_INFO_LOG_LENGTH, &maxLength);
+ glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
#ifdef _MSC_VER
char *log = malloc(maxLength);
#else
char log[maxLength];
#endif
- glGetShaderInfoLog(vertexShader, maxLength, &length, log);
+ glGetShaderInfoLog(shader, maxLength, &length, log);
TraceLog(LOG_INFO, "%s", log);
@@ -3173,36 +3172,19 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade
free(log);
#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();
glAttachShader(program, vertexShader);
@@ -3250,9 +3232,6 @@ static unsigned int LoadShaderProgram(const char *vShaderStr, const char *fShade
program = 0;
}
else TraceLog(LOG_INFO, "[SHDR ID %i] Shader program loaded successfully", program);
-
- glDeleteShader(vertexShader);
- glDeleteShader(fragmentShader);
#endif
return program;
}
@@ -3326,7 +3305,9 @@ static Shader LoadShaderDefault(void)
#endif
"} \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)
{
@@ -3388,6 +3369,8 @@ static void UnloadShaderDefault(void)
{
glUseProgram(0);
+ glDeleteShader(defaultVertexShader);
+ glDeleteShader(defaultFragmentShader);
//glDetachShader(defaultShader, vertexShader);
//glDetachShader(defaultShader, fragmentShader);
//glDeleteShader(vertexShader); // Already deleted on shader compilation