mirror of
https://github.com/raysan5/raylib.git
synced 2025-09-28 05:58:30 +00:00
Unified internal shader to only one
Only defaultShader required, set default value for vertex color attribute if not enabled and fragColor uniform
This commit is contained in:
117
src/rlgl.c
117
src/rlgl.c
@@ -202,7 +202,7 @@ static VertexPositionColorBuffer triangles; // No texture support
|
|||||||
static VertexPositionColorTextureIndexBuffer quads;
|
static VertexPositionColorTextureIndexBuffer quads;
|
||||||
|
|
||||||
// Shader Programs
|
// Shader Programs
|
||||||
static Shader defaultShader, simpleShader;
|
static Shader defaultShader;
|
||||||
static Shader currentShader; // By default, defaultShader
|
static Shader currentShader; // By default, defaultShader
|
||||||
|
|
||||||
// Vertex Array Objects (VAO)
|
// Vertex Array Objects (VAO)
|
||||||
@@ -255,8 +255,7 @@ unsigned int whiteTexture;
|
|||||||
//----------------------------------------------------------------------------------
|
//----------------------------------------------------------------------------------
|
||||||
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#if defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
static Shader LoadDefaultShader(void);
|
static Shader LoadDefaultShader(void);
|
||||||
static Shader LoadSimpleShader(void);
|
static void LoadDefaultShaderLocations(Shader *shader);
|
||||||
static void GetShaderDefaultLocations(Shader *shader);
|
|
||||||
static void InitializeBuffers(void);
|
static void InitializeBuffers(void);
|
||||||
static void InitializeBuffersGPU(void);
|
static void InitializeBuffersGPU(void);
|
||||||
static void UpdateBuffers(void);
|
static void UpdateBuffers(void);
|
||||||
@@ -1021,9 +1020,8 @@ void rlglInit(void)
|
|||||||
if (whiteTexture != 0) TraceLog(INFO, "[TEX ID %i] Base white texture loaded successfully", whiteTexture);
|
if (whiteTexture != 0) TraceLog(INFO, "[TEX ID %i] Base white texture loaded successfully", whiteTexture);
|
||||||
else TraceLog(WARNING, "Base white texture could not be loaded");
|
else TraceLog(WARNING, "Base white texture could not be loaded");
|
||||||
|
|
||||||
// Init default Shader (Custom for GL 3.3 and ES2)
|
// Init default Shader (customized for GL 3.3 and ES2)
|
||||||
defaultShader = LoadDefaultShader();
|
defaultShader = LoadDefaultShader();
|
||||||
simpleShader = LoadSimpleShader();
|
|
||||||
//customShader = LoadShader("custom.vs", "custom.fs"); // Works ok
|
//customShader = LoadShader("custom.vs", "custom.fs"); // Works ok
|
||||||
|
|
||||||
currentShader = defaultShader;
|
currentShader = defaultShader;
|
||||||
@@ -1083,12 +1081,11 @@ void rlglClose(void)
|
|||||||
glDeleteVertexArrays(1, &vaoQuads);
|
glDeleteVertexArrays(1, &vaoQuads);
|
||||||
}
|
}
|
||||||
|
|
||||||
//glDetachShader(defaultShaderProgram, v);
|
//glDetachShader(defaultShaderProgram, vertexShader);
|
||||||
//glDetachShader(defaultShaderProgram, f);
|
//glDetachShader(defaultShaderProgram, fragmentShader);
|
||||||
//glDeleteShader(v);
|
//glDeleteShader(vertexShader); // Already deleted on shader compilation
|
||||||
//glDeleteShader(f);
|
//glDeleteShader(fragmentShader); // Already deleted on sahder compilation
|
||||||
glDeleteProgram(defaultShader.id);
|
glDeleteProgram(defaultShader.id);
|
||||||
glDeleteProgram(simpleShader.id);
|
|
||||||
|
|
||||||
// Free vertex arrays memory
|
// Free vertex arrays memory
|
||||||
free(lines.vertices);
|
free(lines.vertices);
|
||||||
@@ -1124,6 +1121,7 @@ void rlglDraw(void)
|
|||||||
|
|
||||||
glUniformMatrix4fv(currentShader.mvpLoc, 1, false, MatrixToFloat(matMVP));
|
glUniformMatrix4fv(currentShader.mvpLoc, 1, false, MatrixToFloat(matMVP));
|
||||||
glUniform1i(currentShader.mapDiffuseLoc, 0);
|
glUniform1i(currentShader.mapDiffuseLoc, 0);
|
||||||
|
glUniform4f(currentShader.tintColorLoc, 1.0f, 1.0f, 1.0f, 1.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: We draw in this order: lines, triangles, quads
|
// NOTE: We draw in this order: lines, triangles, quads
|
||||||
@@ -1866,6 +1864,8 @@ Model rlglLoadModel(Mesh mesh)
|
|||||||
model.mesh.vboId[1] = 0; // Vertex texcoords VBO
|
model.mesh.vboId[1] = 0; // Vertex texcoords VBO
|
||||||
model.mesh.vboId[2] = 0; // Vertex normals VBO
|
model.mesh.vboId[2] = 0; // Vertex normals VBO
|
||||||
|
|
||||||
|
// TODO: Consider attributes: color, texcoords2, tangents (if available)
|
||||||
|
|
||||||
model.transform = MatrixIdentity();
|
model.transform = MatrixIdentity();
|
||||||
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_11)
|
#if defined(GRAPHICS_API_OPENGL_11)
|
||||||
@@ -1873,7 +1873,7 @@ Model rlglLoadModel(Mesh mesh)
|
|||||||
model.material.shader.id = 0; // No shader used
|
model.material.shader.id = 0; // No shader used
|
||||||
|
|
||||||
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
#elif defined(GRAPHICS_API_OPENGL_33) || defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
model.material.shader = simpleShader; // Default model shader
|
model.material.shader = defaultShader; // Default model shader
|
||||||
|
|
||||||
model.material.texDiffuse.id = whiteTexture; // Default whiteTexture
|
model.material.texDiffuse.id = whiteTexture; // Default whiteTexture
|
||||||
model.material.texDiffuse.width = 1; // Default whiteTexture width
|
model.material.texDiffuse.width = 1; // Default whiteTexture width
|
||||||
@@ -1896,7 +1896,7 @@ Model rlglLoadModel(Mesh mesh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create buffers for our vertex data (positions, texcoords, normals)
|
// Create buffers for our vertex data (positions, texcoords, normals)
|
||||||
glGenBuffers(3, vertexBuffer);
|
glGenBuffers(4, vertexBuffer);
|
||||||
|
|
||||||
// Enable vertex attributes: position
|
// Enable vertex attributes: position
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[0]);
|
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer[0]);
|
||||||
@@ -1916,6 +1916,9 @@ Model rlglLoadModel(Mesh mesh)
|
|||||||
glVertexAttribPointer(model.material.shader.normalLoc, 3, GL_FLOAT, 0, 0, 0);
|
glVertexAttribPointer(model.material.shader.normalLoc, 3, GL_FLOAT, 0, 0, 0);
|
||||||
glEnableVertexAttribArray(model.material.shader.normalLoc);
|
glEnableVertexAttribArray(model.material.shader.normalLoc);
|
||||||
|
|
||||||
|
glVertexAttrib4f(model.material.shader.colorLoc, 1.0f, 1.0f, 1.0f, 1.0f); // Color vertex attribute set to default: WHITE
|
||||||
|
glDisableVertexAttribArray(model.material.shader.colorLoc);
|
||||||
|
|
||||||
model.mesh.vboId[0] = vertexBuffer[0]; // Vertex position VBO
|
model.mesh.vboId[0] = vertexBuffer[0]; // Vertex position VBO
|
||||||
model.mesh.vboId[1] = vertexBuffer[1]; // Texcoords VBO
|
model.mesh.vboId[1] = vertexBuffer[1]; // Texcoords VBO
|
||||||
model.mesh.vboId[2] = vertexBuffer[2]; // Normals VBO
|
model.mesh.vboId[2] = vertexBuffer[2]; // Normals VBO
|
||||||
@@ -2068,7 +2071,7 @@ void *rlglReadTexturePixels(Texture2D texture)
|
|||||||
Model quad;
|
Model quad;
|
||||||
//quad.mesh = GenMeshQuad(width, height);
|
//quad.mesh = GenMeshQuad(width, height);
|
||||||
quad.transform = MatrixIdentity();
|
quad.transform = MatrixIdentity();
|
||||||
quad.shader = simpleShader;
|
quad.shader = defaultShader;
|
||||||
|
|
||||||
DrawModel(quad, (Vector3){ 0.0f, 0.0f, 0.0f }, 1.0f, WHITE);
|
DrawModel(quad, (Vector3){ 0.0f, 0.0f, 0.0f }, 1.0f, WHITE);
|
||||||
|
|
||||||
@@ -2109,11 +2112,12 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
|
|||||||
{
|
{
|
||||||
shader.id = LoadShaderProgram(vShaderStr, fShaderStr);
|
shader.id = LoadShaderProgram(vShaderStr, fShaderStr);
|
||||||
|
|
||||||
if (shader.id != 0) GetShaderDefaultLocations(&shader);
|
// After shader loading, we try to load default location names
|
||||||
|
if (shader.id != 0) LoadDefaultShaderLocations(&shader);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
TraceLog(WARNING, "Custom shader could not be loaded");
|
TraceLog(WARNING, "Custom shader could not be loaded");
|
||||||
shader = simpleShader;
|
shader = defaultShader;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Shader strings must be freed
|
// Shader strings must be freed
|
||||||
@@ -2123,7 +2127,7 @@ Shader LoadShader(char *vsFileName, char *fsFileName)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
TraceLog(WARNING, "Custom shader could not be loaded");
|
TraceLog(WARNING, "Custom shader could not be loaded");
|
||||||
shader = simpleShader;
|
shader = defaultShader;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@@ -2432,20 +2436,20 @@ static Shader LoadDefaultShader(void)
|
|||||||
"in vec2 vertexTexCoord; \n"
|
"in vec2 vertexTexCoord; \n"
|
||||||
"in vec4 vertexColor; \n"
|
"in vec4 vertexColor; \n"
|
||||||
"out vec2 fragTexCoord; \n"
|
"out vec2 fragTexCoord; \n"
|
||||||
"out vec4 fragTintColor; \n"
|
"out vec4 fragColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
char vShaderStr[] = "#version 100 \n"
|
char vShaderStr[] = "#version 100 \n"
|
||||||
"attribute vec3 vertexPosition; \n"
|
"attribute vec3 vertexPosition; \n"
|
||||||
"attribute vec2 vertexTexCoord; \n"
|
"attribute vec2 vertexTexCoord; \n"
|
||||||
"attribute vec4 vertexColor; \n"
|
"attribute vec4 vertexColor; \n"
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
"varying vec4 fragTintColor; \n"
|
"varying vec4 fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
"uniform mat4 mvpMatrix; \n"
|
"uniform mat4 mvpMatrix; \n"
|
||||||
"void main() \n"
|
"void main() \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
" fragTexCoord = vertexTexCoord; \n"
|
" fragTexCoord = vertexTexCoord; \n"
|
||||||
" fragTintColor = vertexColor; \n"
|
" fragColor = vertexColor; \n"
|
||||||
" gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); \n"
|
" gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); \n"
|
||||||
"} \n";
|
"} \n";
|
||||||
|
|
||||||
@@ -2453,23 +2457,24 @@ static Shader LoadDefaultShader(void)
|
|||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
char fShaderStr[] = "#version 330 \n"
|
char fShaderStr[] = "#version 330 \n"
|
||||||
"in vec2 fragTexCoord; \n"
|
"in vec2 fragTexCoord; \n"
|
||||||
"in vec4 fragTintColor; \n"
|
"in vec4 fragColor; \n"
|
||||||
"out vec4 fragColor; \n"
|
"out vec4 finalColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
char fShaderStr[] = "#version 100 \n"
|
char fShaderStr[] = "#version 100 \n"
|
||||||
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
|
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
|
||||||
"varying vec2 fragTexCoord; \n"
|
"varying vec2 fragTexCoord; \n"
|
||||||
"varying vec4 fragTintColor; \n"
|
"varying vec4 fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
"uniform sampler2D texture0; \n"
|
"uniform sampler2D texture0; \n"
|
||||||
|
"uniform vec4 fragTintColor; \n"
|
||||||
"void main() \n"
|
"void main() \n"
|
||||||
"{ \n"
|
"{ \n"
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
#if defined(GRAPHICS_API_OPENGL_33)
|
||||||
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
||||||
" fragColor = texelColor*fragTintColor; \n"
|
" finalColor = texelColor*fragTintColor*fragColor; \n"
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
||||||
" vec4 texelColor = texture2D(texture0, fragTexCoord); \n" // NOTE: texture2D() is deprecated on OpenGL 3.3 and ES 3.0
|
" vec4 texelColor = texture2D(texture0, fragTexCoord); \n" // NOTE: texture2D() is deprecated on OpenGL 3.3 and ES 3.0
|
||||||
" gl_FragColor = texelColor*fragTintColor; \n"
|
" gl_FragColor = texelColor*fragTintColor*fragColor; \n"
|
||||||
#endif
|
#endif
|
||||||
"} \n";
|
"} \n";
|
||||||
|
|
||||||
@@ -2478,73 +2483,13 @@ static Shader LoadDefaultShader(void)
|
|||||||
if (shader.id != 0) TraceLog(INFO, "[SHDR ID %i] Default shader loaded successfully", shader.id);
|
if (shader.id != 0) TraceLog(INFO, "[SHDR ID %i] Default shader loaded successfully", shader.id);
|
||||||
else TraceLog(WARNING, "[SHDR ID %i] Default shader could not be loaded", shader.id);
|
else TraceLog(WARNING, "[SHDR ID %i] Default shader could not be loaded", shader.id);
|
||||||
|
|
||||||
GetShaderDefaultLocations(&shader);
|
LoadDefaultShaderLocations(&shader);
|
||||||
|
|
||||||
return shader;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load Simple Shader (Vertex and Fragment)
|
|
||||||
// NOTE: This shader program is used to render models
|
|
||||||
static Shader LoadSimpleShader(void)
|
|
||||||
{
|
|
||||||
Shader shader;
|
|
||||||
|
|
||||||
// Vertex shader directly defined, no external file required
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
|
||||||
char vShaderStr[] = "#version 330 \n"
|
|
||||||
"in vec3 vertexPosition; \n"
|
|
||||||
"in vec2 vertexTexCoord; \n"
|
|
||||||
"in vec3 vertexNormal; \n"
|
|
||||||
"out vec2 fragTexCoord; \n"
|
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
|
||||||
char vShaderStr[] = "#version 100 \n"
|
|
||||||
"attribute vec3 vertexPosition; \n"
|
|
||||||
"attribute vec2 vertexTexCoord; \n"
|
|
||||||
"attribute vec3 vertexNormal; \n"
|
|
||||||
"varying vec2 fragTexCoord; \n"
|
|
||||||
#endif
|
|
||||||
"uniform mat4 mvpMatrix; \n"
|
|
||||||
"void main() \n"
|
|
||||||
"{ \n"
|
|
||||||
" fragTexCoord = vertexTexCoord; \n"
|
|
||||||
" gl_Position = mvpMatrix*vec4(vertexPosition, 1.0); \n"
|
|
||||||
"} \n";
|
|
||||||
|
|
||||||
// Fragment shader directly defined, no external file required
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
|
||||||
char fShaderStr[] = "#version 330 \n"
|
|
||||||
"in vec2 fragTexCoord; \n"
|
|
||||||
"out vec4 fragColor; \n"
|
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
|
||||||
char fShaderStr[] = "#version 100 \n"
|
|
||||||
"precision mediump float; \n" // precision required for OpenGL ES2 (WebGL)
|
|
||||||
"varying vec2 fragTexCoord; \n"
|
|
||||||
#endif
|
|
||||||
"uniform sampler2D texture0; \n"
|
|
||||||
"uniform vec4 fragTintColor; \n"
|
|
||||||
"void main() \n"
|
|
||||||
"{ \n"
|
|
||||||
#if defined(GRAPHICS_API_OPENGL_33)
|
|
||||||
" vec4 texelColor = texture(texture0, fragTexCoord); \n"
|
|
||||||
" fragColor = texelColor*fragTintColor; \n"
|
|
||||||
#elif defined(GRAPHICS_API_OPENGL_ES2)
|
|
||||||
" vec4 texelColor = texture2D(texture0, fragTexCoord); \n"
|
|
||||||
" gl_FragColor = texelColor*fragTintColor; \n"
|
|
||||||
#endif
|
|
||||||
"} \n";
|
|
||||||
|
|
||||||
shader.id = LoadShaderProgram(vShaderStr, fShaderStr);
|
|
||||||
|
|
||||||
if (shader.id != 0) TraceLog(INFO, "[SHDR ID %i] Simple shader loaded successfully", shader.id);
|
|
||||||
else TraceLog(WARNING, "[SHDR ID %i] Simple shader could not be loaded", shader.id);
|
|
||||||
|
|
||||||
GetShaderDefaultLocations(&shader);
|
|
||||||
|
|
||||||
return shader;
|
return shader;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get location handlers to for shader attributes and uniforms
|
// Get location handlers to for shader attributes and uniforms
|
||||||
static void GetShaderDefaultLocations(Shader *shader)
|
static void LoadDefaultShaderLocations(Shader *shader)
|
||||||
{
|
{
|
||||||
// Get handles to GLSL input attibute locations
|
// Get handles to GLSL input attibute locations
|
||||||
shader->vertexLoc = glGetAttribLocation(shader->id, "vertexPosition");
|
shader->vertexLoc = glGetAttribLocation(shader->id, "vertexPosition");
|
||||||
|
Reference in New Issue
Block a user