Browse Source

Unified internal shader to only one

Only defaultShader required, set default value for vertex color
attribute if not enabled and fragColor uniform
pull/108/head
Ray 9 years ago
parent
commit
b6cec214bd
1 changed files with 33 additions and 88 deletions
  1. +33
    -88
      src/rlgl.c

+ 33
- 88
src/rlgl.c View File

@ -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 GetShaderDefaultLocations(Shader *shader);
static void LoadDefaultShaderLocations(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, f);
//glDeleteShader(v);
//glDeleteShader(f);
//glDetachShader(defaultShaderProgram, vertexShader);
//glDetachShader(defaultShaderProgram, fragmentShader);
//glDeleteShader(vertexShader); // Already deleted on shader compilation
//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]);
@ -1915,7 +1915,10 @@ Model rlglLoadModel(Mesh mesh)
glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*mesh.vertexCount, mesh.normals, GL_STATIC_DRAW); glBufferData(GL_ARRAY_BUFFER, sizeof(float)*3*mesh.vertexCount, mesh.normals, GL_STATIC_DRAW);
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"
"out vec4 fragColor; \n"
"in 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"
" fragColor = texelColor*fragTintColor; \n"
" vec4 texelColor = texture(texture0, fragTexCoord); \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);
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);
LoadDefaultShaderLocations(&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");

Loading…
Cancel
Save