REVIEWED: rlLoadShaderCode()

This commit is contained in:
raysan5 2022-01-13 19:05:45 +01:00
parent e621efe79f
commit f57727995a

View File

@ -3544,61 +3544,66 @@ unsigned int rlLoadShaderCode(const char *vsCode, const char *fsCode)
unsigned int vertexShaderId = 0; unsigned int vertexShaderId = 0;
unsigned int fragmentShaderId = 0; unsigned int fragmentShaderId = 0;
if (vsCode != NULL) { // Compile vertex shader (if provided)
vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER); if (vsCode != NULL) vertexShaderId = rlCompileShader(vsCode, GL_VERTEX_SHADER);
} else { // In case no vertex shader was provided or compilation failed, we use default vertex shader
vertexShaderId = RLGL.State.defaultVShaderId; if (vertexShaderId == 0) vertexShaderId = RLGL.State.defaultVShaderId;
}
if (fsCode != NULL) {
fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER);
} else {
fragmentShaderId = RLGL.State.defaultFShaderId;
}
// Load shader program if provided vertex/fragment shaders compile successfully // Compile fragment shader (if provided)
if ((vertexShaderId != 0) && (fragmentShaderId != 0)) id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId); if (fsCode != NULL) fragmentShaderId = rlCompileShader(fsCode, GL_FRAGMENT_SHADER);
// In case no fragment shader was provided or compilation failed, we use default fragment shader
if (fragmentShaderId == 0) fragmentShaderId = RLGL.State.defaultFShaderId;
// Once shader program is compiled, we can detach and delete vertex/fragment shaders // In case vertex and fragment shader are the default ones, no need to recompile, we can just assign the default shader program id
// NOTE: Vertex if ((vertexShaderId == RLGL.State.defaultVShaderId) && (fragmentShaderId == RLGL.State.defaultFShaderId)) id = RLGL.State.defaultShaderId;
if (vertexShaderId != 0)
{
// Detach shader before deletion to make sure memory is freed
glDetachShader(id, vertexShaderId);
glDeleteShader(vertexShaderId);
}
if (fragmentShaderId != 0)
{
// Detach shader before deletion to make sure memory is freed
glDetachShader(id, fragmentShaderId);
glDeleteShader(fragmentShaderId);
}
if (id == 0)
{
// In case shader loading fails, we return the default shader
TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader");
id = RLGL.State.defaultShaderId;
}
else else
{ {
// Get available shader uniforms // One of or both shader are new, we need to compile a new shader program
// NOTE: This information is useful for debug... id = rlLoadShaderProgram(vertexShaderId, fragmentShaderId);
int uniformCount = -1;
glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount);
for (int i = 0; i < uniformCount; i++) // We can detach and delete vertex/fragment shaders (if not default ones)
// NOTE: We detach shader before deletion to make sure memory is freed
if (vertexShaderId != RLGL.State.defaultVShaderId)
{ {
int namelen = -1; glDetachShader(id, vertexShaderId);
int num = -1; glDeleteShader(vertexShaderId);
char name[256] = { 0 }; // Assume no variable names longer than 256
GLenum type = GL_ZERO;
// Get the name of the uniforms
glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name);
name[namelen] = 0;
TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name));
} }
if (fragmentShaderId != RLGL.State.defaultFShaderId)
{
glDetachShader(id, fragmentShaderId);
glDeleteShader(fragmentShaderId);
}
// In case shader program loading failed, we assign default shader
if (id == 0)
{
// In case shader loading fails, we return the default shader
TRACELOG(RL_LOG_WARNING, "SHADER: Failed to load custom shader code, using default shader");
id = RLGL.State.defaultShaderId;
}
/*
else
{
// Get available shader uniforms
// NOTE: This information is useful for debug...
int uniformCount = -1;
glGetProgramiv(id, GL_ACTIVE_UNIFORMS, &uniformCount);
for (int i = 0; i < uniformCount; i++)
{
int namelen = -1;
int num = -1;
char name[256] = { 0 }; // Assume no variable names longer than 256
GLenum type = GL_ZERO;
// Get the name of the uniforms
glGetActiveUniform(id, i, sizeof(name) - 1, &namelen, &num, &type, name);
name[namelen] = 0;
TRACELOGD("SHADER: [ID %i] Active uniform (%s) set at location: %i", id, name, glGetUniformLocation(id, name));
}
}
*/
} }
#endif #endif