浏览代码

Review default shaders usage on loading

pull/392/head
raysan5 7 年前
父节点
当前提交
09228752ce
共有 3 个文件被更改,包括 45 次插入42 次删除
  1. +1
    -0
      examples/shaders/shaders_postprocessing.c
  2. +42
    -40
      src/rlgl.c
  3. +2
    -2
      src/shader_distortion.h

+ 1
- 0
examples/shaders/shaders_postprocessing.c 查看文件

@ -83,6 +83,7 @@ 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];
// NOTE: Defining 0 (NULL) for vertex shader forces usage of internal default vertex shader
shaders[FX_GRAYSCALE] = LoadShader(0, FormatText("resources/shaders/glsl%i/grayscale.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_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_DREAM_VISION] = LoadShader(0, FormatText("resources/shaders/glsl%i/dream_vision.fs", GLSL_VERSION));

+ 42
- 40
src/rlgl.c 查看文件

@ -268,10 +268,8 @@ static int tempBufferCount = 0;
static bool useTempBuffer = false; static bool useTempBuffer = false;
// Shaders // Shaders
static unsigned int defaultVertexShader; static unsigned int defaultVShaderId; // Default vertex shader id (used by default shader program)
static unsigned int defaultFragmentShader; static unsigned int defaultFShaderId; // Default fragment shader Id (used by default shader program)
// 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)
@ -328,8 +326,9 @@ 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 LoadShaderPartial(const char *shaderStr, int type); // Load custom shader and return shader id static unsigned int CompileShader(const char *shaderStr, int type); // Compile 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 unsigned int LoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId); // Load custom shader program
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)
@ -2356,6 +2355,7 @@ char *LoadText(const char *fileName)
} }
// Load shader from files and bind default locations // Load shader from files and bind default locations
// NOTE: If shader string is NULL, using default vertex/fragment shaders
Shader LoadShader(char *vsFileName, char *fsFileName) Shader LoadShader(char *vsFileName, char *fsFileName)
{ {
Shader shader = { 0 }; Shader shader = { 0 };
@ -2365,31 +2365,28 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2) #if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
unsigned int vertexShader, fragmentShader; unsigned int vertexShaderId, fragmentShaderId;
if (vsFileName == NULL) p">{ if (vsFileName == NULL) n">vertexShaderId = defaultVShaderId;
vertexShader = defaultVertexShader; else
} else { {
char *vShaderStr = LoadText(vsFileName); char *vShaderStr = LoadText(vsFileName);
vertexShader = LoadShaderPartial(vShaderStr, GL_VERTEX_SHADER); vertexShaderId = CompileShader(vShaderStr, GL_VERTEX_SHADER);
free(vShaderStr); free(vShaderStr);
} }
if (fsFileName == NULL) p">{ if (fsFileName == NULL) n">fragmentShaderId = defaultVShaderId;
fragmentShader = defaultVertexShader; else
} else { {
char* fShaderStr = LoadText(fsFileName); char* fShaderStr = LoadText(fsFileName);
fragmentShader = LoadShaderPartial(fShaderStr, GL_FRAGMENT_SHADER); fragmentShaderId = CompileShader(fShaderStr, GL_FRAGMENT_SHADER);
free(fShaderStr); free(fShaderStr);
} }
shader.id = LoadShaderProgram(vertexShader, fragmentShader); shader.id = LoadShaderProgram(vertexShaderId, fragmentShaderId);
// After shader loading, we TRY to set default location names
if (shader.id > 0) SetShaderDefaultLocations(&shader);
if (vertexShader != defaultVertexShader) glDeleteShader(vertexShader); if (vertexShaderId != defaultVShaderId) glDeleteShader(vertexShaderId);
if (fragmentShader != defaultFragmentShader) glDeleteShader(fragmentShader); if (fragmentShaderId != defaultFShaderId) glDeleteShader(fragmentShaderId);
if (shader.id == 0) if (shader.id == 0)
{ {
@ -2397,6 +2394,8 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
shader = defaultShader; shader = defaultShader;
} }
// After shader loading, we TRY to set default location names
if (shader.id > 0) SetShaderDefaultLocations(&shader);
// Get available shader uniforms // Get available shader uniforms
// NOTE: This information is useful for debug... // NOTE: This information is useful for debug...
@ -2421,7 +2420,6 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
TraceLog(LOG_DEBUG, "[SHDR ID %i] Active uniform [%s] set at location: %i", shader.id, name, location); TraceLog(LOG_DEBUG, "[SHDR ID %i] Active uniform [%s] set at location: %i", shader.id, name, location);
} }
#endif #endif
return shader; return shader;
@ -2929,7 +2927,10 @@ void InitVrSimulator(VrDeviceInfo info)
#if defined(SUPPORT_DISTORTION_SHADER) #if defined(SUPPORT_DISTORTION_SHADER)
// Load distortion shader (initialized by default with Oculus Rift CV1 parameters) // Load distortion shader (initialized by default with Oculus Rift CV1 parameters)
vrConfig.distortionShader.id = LoadShaderProgram(vDistortionShaderStr, fDistortionShaderStr); unsigned int vertexShaderId = CompileShader(distortionVShaderStr, GL_VERTEX_SHADER);
unsigned int fragmentShaderId = CompileShader(distortionFShaderStr, GL_FRAGMENT_SHADER);
vrConfig.distortionShader.id = LoadShaderProgram(vertexShaderId, fragmentShaderId);
if (vrConfig.distortionShader.id > 0) SetShaderDefaultLocations(&vrConfig.distortionShader); if (vrConfig.distortionShader.id > 0) SetShaderDefaultLocations(&vrConfig.distortionShader);
#endif #endif
@ -3143,7 +3144,8 @@ static void LoadTextureCompressed(unsigned char *data, int width, int height, in
} }
} }
static unsigned int LoadShaderPartial(const char *shaderStr, int type) // Compile custom shader and return shader id
static unsigned int CompileShader(const char *shaderStr, int type)
{ {
unsigned int shader = glCreateShader(type); unsigned int shader = glCreateShader(type);
glShaderSource(shader, 1, &shaderStr, NULL); glShaderSource(shader, 1, &shaderStr, NULL);
@ -3154,7 +3156,7 @@ static unsigned int LoadShaderPartial(const char *shaderStr, int type)
if (success != GL_TRUE) if (success != GL_TRUE)
{ {
TraceLog(LOG_WARNING, "[VSHDR ID %i] Failed to compile shader...", shader); TraceLog(LOG_WARNING, "[SHDR ID %i] Failed to compile shader...", shader);
int maxLength = 0; int maxLength = 0;
int length; int length;
glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength); glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &maxLength);
@ -3172,13 +3174,13 @@ static unsigned int LoadShaderPartial(const char *shaderStr, int type)
free(log); free(log);
#endif #endif
} }
else TraceLog(LOG_INFO, "[VSHDR ID %i] Shader compiled successfully", shader); else TraceLog(LOG_INFO, "[SHDR ID %i] Shader compiled successfully", shader);
return shader; return shader;
} }
// Load custom shader strings and return program id // Load custom shader strings and return program id
static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fragmentShader) static unsigned int LoadShaderProgram(unsigned int vShaderId, unsigned int fShaderId)
{ {
unsigned int program = 0; unsigned int program = 0;
@ -3187,8 +3189,8 @@ static unsigned int LoadShaderProgram(unsigned int vertexShader, unsigned int fr
GLint success = 0; GLint success = 0;
program = glCreateProgram(); program = glCreateProgram();
glAttachShader(program, vertexShader); glAttachShader(program, vShaderId);
glAttachShader(program, fragmentShader); glAttachShader(program, fShaderId);
// NOTE: Default attribute shader locations must be binded before linking // NOTE: Default attribute shader locations must be binded before linking
glBindAttribLocation(program, 0, DEFAULT_ATTRIB_POSITION_NAME); glBindAttribLocation(program, 0, DEFAULT_ATTRIB_POSITION_NAME);
@ -3247,7 +3249,7 @@ static Shader LoadShaderDefault(void)
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;
// Vertex shader directly defined, no external file required // Vertex shader directly defined, no external file required
char vDefaultShaderStr[] = char defaultVShaderStr[] =
#if defined(GRAPHICS_API_OPENGL_21) #if defined(GRAPHICS_API_OPENGL_21)
"#version 120 \n" "#version 120 \n"
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
@ -3276,7 +3278,7 @@ static Shader LoadShaderDefault(void)
"} \n"; "} \n";
// Fragment shader directly defined, no external file required // Fragment shader directly defined, no external file required
char fDefaultShaderStr[] = char defaultFShaderStr[] =
#if defined(GRAPHICS_API_OPENGL_21) #if defined(GRAPHICS_API_OPENGL_21)
"#version 120 \n" "#version 120 \n"
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
@ -3305,9 +3307,11 @@ static Shader LoadShaderDefault(void)
#endif #endif
"} \n"; "} \n";
defaultVertexShader = LoadShaderPartial(vDefaultShaderStr, GL_VERTEX_SHADER); // NOTE: Compiled vertex/fragment shaders are kept for re-use
defaultFragmentShader = LoadShaderPartial(fDefaultShaderStr, GL_FRAGMENT_SHADER); defaultVShaderId = CompileShader(defaultVShaderStr, GL_VERTEX_SHADER); // Compile default vertex shader
shader.id = LoadShaderProgram(defaultVertexShader, defaultFragmentShader); defaultFShaderId = CompileShader(defaultFShaderStr, GL_FRAGMENT_SHADER); // Compile default fragment shader
shader.id = LoadShaderProgram(defaultVShaderId, defaultFShaderId);
if (shader.id > 0) if (shader.id > 0)
{ {
@ -3369,12 +3373,10 @@ static void UnloadShaderDefault(void)
{ {
glUseProgram(0); glUseProgram(0);
glDeleteShader(defaultVertexShader); glDetachShader(defaultShader.id, defaultVShaderId);
glDeleteShader(defaultFragmentShader); glDetachShader(defaultShader.id, defaultFShaderId);
//glDetachShader(defaultShader, vertexShader); glDeleteShader(defaultVShaderId);
//glDetachShader(defaultShader, fragmentShader); glDeleteShader(defaultFShaderId);
//glDeleteShader(vertexShader); // Already deleted on shader compilation
//glDeleteShader(fragmentShader); // Already deleted on shader compilation
glDeleteProgram(defaultShader.id); glDeleteProgram(defaultShader.id);
} }

+ 2
- 2
src/shader_distortion.h 查看文件

@ -1,6 +1,6 @@
// Vertex shader definition to embed, no external file required // Vertex shader definition to embed, no external file required
static const char vDistortionShaderStr[] = static const char distortionVShaderStr[] =
#if defined(GRAPHICS_API_OPENGL_21) #if defined(GRAPHICS_API_OPENGL_21)
"#version 120 \n" "#version 120 \n"
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)
@ -29,7 +29,7 @@ static const char vDistortionShaderStr[] =
"} \n"; "} \n";
// Fragment shader definition to embed, no external file required // Fragment shader definition to embed, no external file required
static const char fDistortionShaderStr[] = static const char distortionFShaderStr[] =
#if defined(GRAPHICS_API_OPENGL_21) #if defined(GRAPHICS_API_OPENGL_21)
"#version 120 \n" "#version 120 \n"
#elif defined(GRAPHICS_API_OPENGL_ES2) #elif defined(GRAPHICS_API_OPENGL_ES2)

||||||
x
 
000:0
正在加载...
取消
保存