Set up a multipass shader
This commit is contained in:
@ -49,6 +49,10 @@ elseif(TARGET_TYPE STREQUAL game)
|
|||||||
${ASSETS_SOURCE_DIR}/shared/shaders/textured.vert shaders/textured.vert
|
${ASSETS_SOURCE_DIR}/shared/shaders/textured.vert shaders/textured.vert
|
||||||
${ASSETS_SOURCE_DIR}/shared/shaders/textured.frag shaders/textured.frag
|
${ASSETS_SOURCE_DIR}/shared/shaders/textured.frag shaders/textured.frag
|
||||||
)
|
)
|
||||||
|
tool_copy(shader_test
|
||||||
|
${ASSETS_SOURCE_DIR}/shared/shaders/test.vert shaders/test.vert
|
||||||
|
${ASSETS_SOURCE_DIR}/shared/shaders/test.frag shaders/test.frag
|
||||||
|
)
|
||||||
|
|
||||||
# Fonts
|
# Fonts
|
||||||
tool_copy(font_opensans
|
tool_copy(font_opensans
|
||||||
@ -143,6 +147,7 @@ elseif(TARGET_TYPE STREQUAL game)
|
|||||||
vn_sammy
|
vn_sammy
|
||||||
|
|
||||||
shader_textured
|
shader_textured
|
||||||
|
shader_test
|
||||||
font_opensans
|
font_opensans
|
||||||
texture_test
|
texture_test
|
||||||
)
|
)
|
||||||
|
@ -10,11 +10,10 @@
|
|||||||
void shaderInit(shader_t *shader,
|
void shaderInit(shader_t *shader,
|
||||||
char *vertexShaderSource, char* fragmentShaderSource
|
char *vertexShaderSource, char* fragmentShaderSource
|
||||||
) {
|
) {
|
||||||
int32_t isSuccess, maxLength, i;
|
int32_t isSuccess, maxLength, i, texture;
|
||||||
char *error;
|
char *error;
|
||||||
GLuint shaderVertex, shaderFragment, shaderProgram;
|
GLuint shaderVertex, shaderFragment, shaderProgram;
|
||||||
GLint size; // size of the variable
|
GLint size; // size of the variable
|
||||||
GLenum type; // type of the variable (float, vec3 or mat4, etc)
|
|
||||||
GLsizei length; // name length
|
GLsizei length; // name length
|
||||||
|
|
||||||
GLchar const* filesVertex[] = { vertexShaderSource };
|
GLchar const* filesVertex[] = { vertexShaderSource };
|
||||||
@ -77,14 +76,19 @@ void shaderInit(shader_t *shader,
|
|||||||
// Extract uniforms
|
// Extract uniforms
|
||||||
glGetProgramiv(shaderProgram, GL_ACTIVE_UNIFORMS, &shader->uniformCount);
|
glGetProgramiv(shaderProgram, GL_ACTIVE_UNIFORMS, &shader->uniformCount);
|
||||||
|
|
||||||
|
texture = 0;
|
||||||
for(i = 0; i < shader->uniformCount; i++) {
|
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(
|
glGetActiveUniform(
|
||||||
shaderProgram, (GLuint)i, SHADER_UNIFORM_NAME_MAX,
|
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.
|
// TODO: Reset uniforms to zero.
|
||||||
|
if(shader->types[i] == GL_SAMPLER_2D) shader->textureSlots[i] = texture++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Bind the shader
|
// Bind the shader
|
||||||
@ -94,7 +98,7 @@ void shaderInit(shader_t *shader,
|
|||||||
shaderuniform_t shaderGetUniform(shader_t *shader, char *name) {
|
shaderuniform_t shaderGetUniform(shader_t *shader, char *name) {
|
||||||
int32_t i;
|
int32_t i;
|
||||||
for(i = 0; i < shader->uniformCount; 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;
|
return (shaderuniform_t)-1;
|
||||||
}
|
}
|
||||||
@ -112,8 +116,8 @@ void shaderUse(shader_t *shader) {
|
|||||||
void shaderUseTexture(
|
void shaderUseTexture(
|
||||||
shader_t *shader, shaderuniform_t uniform, texture_t *texture
|
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
|
// TODO: I need to be able to get the texture ID
|
||||||
int32_t i = 0;
|
|
||||||
glActiveTexture(GL_TEXTURE0 + i);
|
glActiveTexture(GL_TEXTURE0 + i);
|
||||||
glBindTexture(GL_TEXTURE_2D, texture->id);
|
glBindTexture(GL_TEXTURE_2D, texture->id);
|
||||||
glUniform1i(uniform, i);
|
glUniform1i(uniform, i);
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
#include "../../util/array.h"
|
#include "../../util/array.h"
|
||||||
|
|
||||||
#define SHADER_UNIFORM_NAME_MAX 24
|
#define SHADER_UNIFORM_NAME_MAX 24
|
||||||
#define SHADER_UNIFORM_COUNT 8
|
#define SHADER_UNIFORM_COUNT 16
|
||||||
|
|
||||||
/** Representation of a shader uniform */
|
/** Representation of a shader uniform */
|
||||||
typedef GLuint shaderuniform_t;
|
typedef GLuint shaderuniform_t;
|
||||||
@ -27,14 +27,23 @@ typedef struct {
|
|||||||
shaderuniform_t shaderVertex;
|
shaderuniform_t shaderVertex;
|
||||||
|
|
||||||
/** Pointer to an uploaded fragment shader program */
|
/** Pointer to an uploaded fragment shader program */
|
||||||
shaderuniform_t shaderFrag;
|
GLuint shaderFrag;
|
||||||
|
|
||||||
/** Pointer to an uploaded shader program linked */
|
/** 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 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;
|
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;
|
} shader_t;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,6 +17,9 @@ bool sandboxGameInit(sandboxgame_t *game) {
|
|||||||
assetManagerLoadShader(&game->engine.assetManager, game->scene.assetOwner,
|
assetManagerLoadShader(&game->engine.assetManager, game->scene.assetOwner,
|
||||||
&game->shader, "shaders/textured.vert", "shaders/textured.frag"
|
&game->shader, "shaders/textured.vert", "shaders/textured.frag"
|
||||||
);
|
);
|
||||||
|
assetManagerLoadShader(&game->engine.assetManager, game->scene.assetOwner,
|
||||||
|
&game->shader2, "shaders/test.vert", "shaders/test.frag"
|
||||||
|
);
|
||||||
|
|
||||||
// Load the texture
|
// Load the texture
|
||||||
assetManagerLoadScaledTexture(
|
assetManagerLoadScaledTexture(
|
||||||
@ -28,8 +31,16 @@ bool sandboxGameInit(sandboxgame_t *game) {
|
|||||||
&game->st, &game->texture, 0
|
&game->st, &game->texture, 0
|
||||||
);
|
);
|
||||||
|
|
||||||
quadInit(&game->quad, 0, 0,0,0,0, 500,500,1,1);
|
assetManagerLoadTexture(
|
||||||
|
&game->engine.assetManager, game->scene.assetOwner,
|
||||||
|
&game->texture, "textures/test_texture.png"
|
||||||
|
);
|
||||||
|
|
||||||
|
cubeInit(&game->quad, 1, 1, 1);
|
||||||
|
|
||||||
i = renderPassAdd(&game->scene.renderList, &game->shader);
|
i = renderPassAdd(&game->scene.renderList, &game->shader);
|
||||||
|
i = renderPassAdd(&game->scene.renderList, &game->shader);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,34 +51,48 @@ void sandboxGameUpdate(sandboxgame_t *game) {
|
|||||||
n = assetManagerProgressGet(&game->engine.assetManager);
|
n = assetManagerProgressGet(&game->engine.assetManager);
|
||||||
if(n < 1.0f) return;
|
if(n < 1.0f) return;
|
||||||
|
|
||||||
// First pass
|
|
||||||
sceneRenderStart(&game->scene);
|
sceneRenderStart(&game->scene);
|
||||||
renderListRenderPass(&game->scene.renderList, &game->engine, 0);
|
|
||||||
|
|
||||||
cameraOrtho(&camera,
|
|
||||||
0, game->engine.render.width,
|
|
||||||
game->engine.render.height, 0,
|
|
||||||
0.01f, 1000.0f
|
|
||||||
);
|
|
||||||
cameraLookAt(&camera, 0,0,10, 0,0,0);
|
|
||||||
|
|
||||||
|
// First pass
|
||||||
shaderuniform_t uniView = shaderGetUniform(&game->shader, "u_View");
|
shaderuniform_t uniView = shaderGetUniform(&game->shader, "u_View");
|
||||||
shaderuniform_t uniProj = shaderGetUniform(&game->shader, "u_Proj");
|
shaderuniform_t uniProj = shaderGetUniform(&game->shader, "u_Proj");
|
||||||
shaderuniform_t uniModel = shaderGetUniform(&game->shader, "u_Modl");
|
shaderuniform_t uniModel = shaderGetUniform(&game->shader, "u_Modl");
|
||||||
shaderuniform_t uniColor = shaderGetUniform(&game->shader, "u_Colr");
|
shaderuniform_t uniColor = shaderGetUniform(&game->shader, "u_Colr");
|
||||||
shaderuniform_t uniTexture = shaderGetUniform(&game->shader, "u_Text");
|
shaderuniform_t uniTexture = shaderGetUniform(&game->shader, "u_Text");
|
||||||
|
|
||||||
|
renderpass_t *pass =renderListRenderPass(
|
||||||
|
&game->scene.renderList, &game->engine, 0
|
||||||
|
);
|
||||||
|
cameraPerspective(&camera, 45.0f,
|
||||||
|
game->engine.render.width/game->engine.render.height, 0.001f, 1000.0f
|
||||||
|
);
|
||||||
|
cameraLookAt(&camera, 3,3,3, 0,0,0);
|
||||||
|
|
||||||
shaderUse(&game->shader);
|
shaderUseCamera(pass->shader, uniView, uniProj, &camera);
|
||||||
shaderUseCamera(&game->shader, uniView, uniProj, &camera);
|
shaderUseColor(pass->shader, uniColor, PIXEL_COLOR_WHITE);
|
||||||
shaderUseColor(&game->shader, uniColor, PIXEL_COLOR_WHITE);
|
shaderUseTexture(pass->shader, uniTexture, &game->texture);
|
||||||
shaderUseTexture(&game->shader, uniTexture, &game->texture);
|
shaderUsePosition(pass->shader, uniModel, 0,0,0,
|
||||||
shaderUsePosition(&game->shader, uniModel, 0,0,0, 0,0,0);
|
game->engine.time.current/2.0f, game->engine.time.current, 0
|
||||||
|
);
|
||||||
primitiveDraw(&game->quad, 0, -1);
|
primitiveDraw(&game->quad, 0, -1);
|
||||||
|
|
||||||
sceneRenderEnd(&game->scene, &game->shader,
|
|
||||||
uniView, uniProj, uniModel, &uniTexture,
|
pass = renderListRenderPass(&game->scene.renderList, &game->engine, 1);
|
||||||
&game->shader,
|
shaderUsePosition(pass->shader, uniModel, 0,0,0,
|
||||||
uniView, uniProj, uniModel, uniTexture
|
-game->engine.time.current/2.0f, -game->engine.time.current, 0
|
||||||
|
);
|
||||||
|
primitiveDraw(&game->quad, 0, -1);
|
||||||
|
|
||||||
|
shaderuniform_t uniTextureSet[2];
|
||||||
|
uniTextureSet[0] = shaderGetUniform(&game->shader2, "u_Text0");
|
||||||
|
uniTextureSet[1] = shaderGetUniform(&game->shader2, "u_Text1");
|
||||||
|
|
||||||
|
sceneRenderEnd(&game->scene, &game->shader2,
|
||||||
|
shaderGetUniform(&game->shader2, "u_View"),
|
||||||
|
shaderGetUniform(&game->shader2, "u_Proj"),
|
||||||
|
shaderGetUniform(&game->shader2, "u_Modl"),
|
||||||
|
uniTextureSet,
|
||||||
|
&game->shader, uniView, uniProj, uniModel, uniTexture
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -12,6 +12,7 @@
|
|||||||
#include "../../display/shader/shader.h"
|
#include "../../display/shader/shader.h"
|
||||||
#include "../../display/primitive/primitive.h"
|
#include "../../display/primitive/primitive.h"
|
||||||
#include "../../display/primitive/quad.h"
|
#include "../../display/primitive/quad.h"
|
||||||
|
#include "../../display/primitive/cube.h"
|
||||||
#include "../../display/scaledtexture.h"
|
#include "../../display/scaledtexture.h"
|
||||||
#include "../../file/asset.h"
|
#include "../../file/asset.h"
|
||||||
#include "../../ui/label.h"
|
#include "../../ui/label.h"
|
||||||
@ -20,13 +21,13 @@
|
|||||||
#include "../../file/xml.h"
|
#include "../../file/xml.h"
|
||||||
#include "../../engine/engine.h"
|
#include "../../engine/engine.h"
|
||||||
#include "../../display/renderlist.h"
|
#include "../../display/renderlist.h"
|
||||||
|
|
||||||
#include "../scene/scene.h"
|
#include "../scene/scene.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
engine_t engine;
|
engine_t engine;
|
||||||
scene_t scene;
|
scene_t scene;
|
||||||
shader_t shader;
|
shader_t shader;
|
||||||
|
shader_t shader2;
|
||||||
texture_t texture;
|
texture_t texture;
|
||||||
primitive_t quad;
|
primitive_t quad;
|
||||||
scaledtexture_t st;
|
scaledtexture_t st;
|
||||||
|
Reference in New Issue
Block a user