Set up a multipass shader
This commit is contained in:
@ -10,11 +10,10 @@
|
||||
void shaderInit(shader_t *shader,
|
||||
char *vertexShaderSource, char* fragmentShaderSource
|
||||
) {
|
||||
int32_t isSuccess, maxLength, i;
|
||||
int32_t isSuccess, maxLength, i, texture;
|
||||
char *error;
|
||||
GLuint shaderVertex, shaderFragment, shaderProgram;
|
||||
GLint size; // size of the variable
|
||||
GLenum type; // type of the variable (float, vec3 or mat4, etc)
|
||||
GLsizei length; // name length
|
||||
|
||||
GLchar const* filesVertex[] = { vertexShaderSource };
|
||||
@ -77,14 +76,19 @@ void shaderInit(shader_t *shader,
|
||||
// Extract uniforms
|
||||
glGetProgramiv(shaderProgram, GL_ACTIVE_UNIFORMS, &shader->uniformCount);
|
||||
|
||||
texture = 0;
|
||||
for(i = 0; i < shader->uniformCount; i++) {
|
||||
shader->uniforms[i] = shader->uniformBuffer + (i * SHADER_UNIFORM_NAME_MAX);
|
||||
shader->uniformNames[i] = (
|
||||
shader->uniformBuffer + (i * SHADER_UNIFORM_NAME_MAX)
|
||||
);
|
||||
|
||||
glGetActiveUniform(
|
||||
shaderProgram, (GLuint)i, SHADER_UNIFORM_NAME_MAX,
|
||||
&length, &size, &type, shader->uniforms[i]
|
||||
&length, &size, shader->types + i, shader->uniformNames[i]
|
||||
);
|
||||
|
||||
// TODO: Reset uniforms to zero.
|
||||
if(shader->types[i] == GL_SAMPLER_2D) shader->textureSlots[i] = texture++;
|
||||
}
|
||||
|
||||
// Bind the shader
|
||||
@ -94,7 +98,7 @@ void shaderInit(shader_t *shader,
|
||||
shaderuniform_t shaderGetUniform(shader_t *shader, char *name) {
|
||||
int32_t i;
|
||||
for(i = 0; i < shader->uniformCount; i++) {
|
||||
if(strcmp(shader->uniforms[i], name) == 0) return i;
|
||||
if(strcmp(shader->uniformNames[i], name) == 0) return i;
|
||||
}
|
||||
return (shaderuniform_t)-1;
|
||||
}
|
||||
@ -112,8 +116,8 @@ void shaderUse(shader_t *shader) {
|
||||
void shaderUseTexture(
|
||||
shader_t *shader, shaderuniform_t uniform, texture_t *texture
|
||||
) {
|
||||
int32_t i = shader->textureSlots[(int32_t)uniform];
|
||||
// TODO: I need to be able to get the texture ID
|
||||
int32_t i = 0;
|
||||
glActiveTexture(GL_TEXTURE0 + i);
|
||||
glBindTexture(GL_TEXTURE_2D, texture->id);
|
||||
glUniform1i(uniform, i);
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include "../../util/array.h"
|
||||
|
||||
#define SHADER_UNIFORM_NAME_MAX 24
|
||||
#define SHADER_UNIFORM_COUNT 8
|
||||
#define SHADER_UNIFORM_COUNT 16
|
||||
|
||||
/** Representation of a shader uniform */
|
||||
typedef GLuint shaderuniform_t;
|
||||
@ -27,14 +27,23 @@ typedef struct {
|
||||
shaderuniform_t shaderVertex;
|
||||
|
||||
/** Pointer to an uploaded fragment shader program */
|
||||
shaderuniform_t shaderFrag;
|
||||
GLuint shaderFrag;
|
||||
|
||||
/** Pointer to an uploaded shader program linked */
|
||||
shaderuniform_t shaderProgram;
|
||||
GLuint shaderProgram;
|
||||
|
||||
/** Buffer of chars where we store the uniform names */
|
||||
char uniformBuffer[SHADER_UNIFORM_NAME_MAX * SHADER_UNIFORM_COUNT];
|
||||
char *uniforms[SHADER_UNIFORM_COUNT];
|
||||
|
||||
/** Array of strings (pointers to the above buffer) of the uniform names */
|
||||
char *uniformNames[SHADER_UNIFORM_COUNT];
|
||||
int32_t uniformCount;
|
||||
|
||||
/** Type of each uniform */
|
||||
GLenum types[SHADER_UNIFORM_COUNT];
|
||||
|
||||
/** Texture Slots (which texture slot for GL to use for each uniform) */
|
||||
uint8_t textureSlots[SHADER_UNIFORM_COUNT];
|
||||
} shader_t;
|
||||
|
||||
/**
|
||||
|
Reference in New Issue
Block a user