Skip to content

Commit 1837cd0

Browse files
authored
Custom shaders during a shadow pass. (#7613)
#changelog #gl
1 parent aef438b commit 1837cd0

5 files changed

Lines changed: 95 additions & 19 deletions

File tree

libs/openFrameworks/gl/ofGLProgrammableRenderer.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1290,6 +1290,19 @@ void ofGLProgrammableRenderer::bind(const ofShader & shader){
12901290
if(currentShader && *currentShader==shader){
12911291
return;
12921292
}
1293+
1294+
if(bIsShadowDepthPass) {
1295+
// if we are not the shadow shader, lets unbind it
1296+
if(!settingDefaultShader && currentShadow && currentShader ) {
1297+
// lets assume it's bound?
1298+
if(!bCustomShadowShader) {
1299+
glUseProgram(0);
1300+
}
1301+
// we are assuming that since it's a custom depth shader, it all will be taken care of ...
1302+
bCustomShadowShader=true;
1303+
}
1304+
}
1305+
12931306
glUseProgram(shader.getProgram());
12941307

12951308
currentShader = &shader;
@@ -1304,6 +1317,7 @@ void ofGLProgrammableRenderer::bind(const ofShader & shader){
13041317
void ofGLProgrammableRenderer::unbind(const ofShader & shader){
13051318
glUseProgram(0);
13061319
usingCustomShader = false;
1320+
bCustomShadowShader=false;
13071321
beginDefaultShader();
13081322
}
13091323

@@ -1434,6 +1448,7 @@ void ofGLProgrammableRenderer::unbind(const ofBaseMaterial &){
14341448
void ofGLProgrammableRenderer::unbind(const ofShadow & shadow) {
14351449
currentShadow = nullptr;
14361450
bIsShadowDepthPass = false;
1451+
bCustomShadowShader = false;
14371452
beginDefaultShader();
14381453
}
14391454

@@ -1569,11 +1584,12 @@ void ofGLProgrammableRenderer::setDefaultUniforms(){
15691584
//----------------------------------------------------------
15701585
void ofGLProgrammableRenderer::beginDefaultShader(){
15711586
if(usingCustomShader && !currentMaterial && !currentShadow) return;
1587+
if( currentShadow && bCustomShadowShader ) return;
15721588

15731589
const ofShader * nextShader = nullptr;
15741590

15751591
if(!uniqueShader || currentMaterial || currentShadow ){
1576-
if( currentShadow ) {
1592+
if(currentShadow) {
15771593
nextShader = &currentShadow->getDepthShader(*this);
15781594
} else if(currentMaterial){
15791595
// std::cout << "ofGLProgrammableRenderer::beginDefaultShader: " << currentTextureTarget << " | " << ofGetFrameNum() << std::endl;

libs/openFrameworks/gl/ofGLProgrammableRenderer.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,7 @@ class ofGLProgrammableRenderer: public ofBaseGLRenderer{
285285
const ofShadow* currentShadow;
286286
bool bIsShadowDepthPass;
287287
GLenum shadowCubeFace;
288+
bool bCustomShadowShader = false;
288289

289290
ofStyle currentStyle;
290291
std::deque <ofStyle> styleHistory;

libs/openFrameworks/gl/ofShadow.cpp

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,6 +1140,52 @@ void ofShadow::_updateNumShadows() {
11401140
#include "shaders/shadowDepth.frag"
11411141
#include "shaders/shadowDepthCubeGeom.glsl"
11421142

1143+
bool ofShadow::setupShadowDepthShader(ofShader& ashader, const std::string aShaderMain) {
1144+
return setupShadowDepthShader( ashader, data->lightType, aShaderMain );
1145+
}
1146+
1147+
bool ofShadow::setupShadowDepthShader(ofShader& ashader, int aLightType, const std::string aShaderMain) {
1148+
std::string gversion = "#version 150\n";
1149+
#ifdef TARGET_OPENGLES
1150+
gversion = "#version 300 es\nprecision highp float;\n";
1151+
#endif
1152+
std::string tdefines = "#define SINGLE_PASS\n";
1153+
1154+
bool bDepthCubeSinglePass = false;
1155+
1156+
if( aLightType == OF_LIGHT_POINT ) {
1157+
#ifndef TARGET_OPENGLES
1158+
if(isSingleOmniPass()) {
1159+
//return shaders[&renderer]->depthCube;
1160+
tdefines = "#define CUBE_MAP_SINGLE_PASS\n";
1161+
bDepthCubeSinglePass = true;
1162+
} else {
1163+
//return shaders[&renderer]->depthCubeMultiPass;
1164+
tdefines = "#define CUBE_MAP_MULTI_PASS\n";
1165+
}
1166+
#else
1167+
//return shaders[&renderer]->depthCubeMultiPass;
1168+
tdefines = "#define CUBE_MAP_MULTI_PASS\n";
1169+
#endif
1170+
} else if( aLightType == OF_LIGHT_AREA ) {
1171+
//return shaders[&renderer]->depth;
1172+
} else {
1173+
//return shaders[&renderer]->depth;
1174+
}
1175+
1176+
ashader.setupShaderFromSource(GL_VERTEX_SHADER,gversion+tdefines+depthVertexShaderSource+aShaderMain);
1177+
ashader.setupShaderFromSource(GL_FRAGMENT_SHADER,gversion+tdefines+depthFragShaderSource);
1178+
1179+
#ifndef TARGET_OPENGLES
1180+
if(bDepthCubeSinglePass) {
1181+
ashader.setupShaderFromSource(GL_GEOMETRY_SHADER_EXT,depthCubeGeometryShaderSource);
1182+
}
1183+
#endif
1184+
1185+
ashader.bindDefaults();
1186+
return ashader.linkProgram();
1187+
}
1188+
11431189

11441190
void ofShadow::initShaders(ofGLProgrammableRenderer & renderer) const{
11451191
auto rendererShaders = shaders.find(&renderer);
@@ -1152,19 +1198,21 @@ void ofShadow::initShaders(ofGLProgrammableRenderer & renderer) const{
11521198
gversion = "#version 300 es\nprecision highp float;\n";
11531199
#endif
11541200

1155-
shaders[&renderer]->depth.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define SINGLE_PASS\n"+depthVertexShaderSource);
1201+
std::string vertString = depthVertexShaderSource+depthVertexShader_Main;
1202+
1203+
shaders[&renderer]->depth.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define SINGLE_PASS\n"+vertString);
11561204
shaders[&renderer]->depth.setupShaderFromSource(GL_FRAGMENT_SHADER,gversion+"#define SINGLE_PASS\n"+depthFragShaderSource);
11571205
shaders[&renderer]->depth.bindDefaults();
11581206
shaders[&renderer]->depth.linkProgram();
11591207

11601208
#ifndef TARGET_OPENGLES
1161-
shaders[&renderer]->depthCube.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define CUBE_MAP_SINGLE_PASS\n"+depthVertexShaderSource);
1209+
shaders[&renderer]->depthCube.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define CUBE_MAP_SINGLE_PASS\n"+vertString);
11621210
shaders[&renderer]->depthCube.setupShaderFromSource(GL_FRAGMENT_SHADER,gversion+"#define CUBE_MAP_SINGLE_PASS\n"+depthFragShaderSource);
11631211
shaders[&renderer]->depthCube.setupShaderFromSource(GL_GEOMETRY_SHADER_EXT,depthCubeGeometryShaderSource);
11641212
shaders[&renderer]->depthCube.bindDefaults();
11651213
shaders[&renderer]->depthCube.linkProgram();
11661214
#endif
1167-
shaders[&renderer]->depthCubeMultiPass.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define CUBE_MAP_MULTI_PASS\n"+depthVertexShaderSource);
1215+
shaders[&renderer]->depthCubeMultiPass.setupShaderFromSource(GL_VERTEX_SHADER,gversion+"#define CUBE_MAP_MULTI_PASS\n"+vertString);
11681216
shaders[&renderer]->depthCubeMultiPass.setupShaderFromSource(GL_FRAGMENT_SHADER,gversion+"#define CUBE_MAP_MULTI_PASS\n"+depthFragShaderSource);
11691217
shaders[&renderer]->depthCubeMultiPass.bindDefaults();
11701218
shaders[&renderer]->depthCubeMultiPass.linkProgram();

libs/openFrameworks/gl/ofShadow.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,8 @@ class ofShadow {
165165
std::string getShadowTypeAsString();
166166

167167
const ofShader & getDepthShader(ofGLProgrammableRenderer & renderer) const;
168+
bool setupShadowDepthShader(ofShader& ashader, const std::string aShaderMain);
169+
bool setupShadowDepthShader(ofShader& ashader, int aLightType, const std::string aShaderMain);
168170
void updateDepth(const ofShader & shader,ofGLProgrammableRenderer & renderer) const;
169171
void updateDepth(const ofShader & shader,GLenum aCubeFace,ofGLProgrammableRenderer & renderer) const;
170172

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11

22
static const std::string depthVertexShaderSource = R"(
33

4-
//#version 330
5-
6-
in vec4 position;
7-
8-
// these are passed in from OF programmable renderer
9-
uniform mat4 modelMatrix;
10-
114
// depth camera's view projection matrix
125
#if defined(SINGLE_PASS) || defined(CUBE_MAP_MULTI_PASS)
136
uniform mat4 lightsViewProjectionMatrix;
@@ -17,21 +10,37 @@ uniform mat4 lightsViewProjectionMatrix;
1710
out vec3 v_worldPosition;
1811
#endif
1912

20-
void main() {
21-
13+
void sendShadowDepthWorldPosition(in vec3 aWorldPos) {
2214
#if defined(SINGLE_PASS)
23-
vec3 worldPosition = (modelMatrix * vec4(position.xyz, 1.0)).xyz;
24-
gl_Position = lightsViewProjectionMatrix * vec4(worldPosition, 1.0);
15+
gl_Position = lightsViewProjectionMatrix * vec4(aWorldPos, 1.0);
2516
#endif
2617

2718
#ifdef CUBE_MAP_SINGLE_PASS
28-
gl_Position = modelMatrix * vec4(position.xyz, 1.0);
19+
gl_Position = vec4(aWorldPos, 1.0);
2920
#endif
3021

3122
#if defined(CUBE_MAP_MULTI_PASS)
32-
v_worldPosition = (modelMatrix * vec4(position.xyz, 1.0)).xyz;
33-
gl_Position = lightsViewProjectionMatrix * vec4(v_worldPosition, 1.0);
23+
v_worldPosition = aWorldPos;
24+
gl_Position = lightsViewProjectionMatrix * vec4(aWorldPos, 1.0);
3425
#endif
35-
3626
}
27+
28+
void sendShadowDepthWorldPosition(in vec4 aWorldPos) {
29+
sendShadowDepthWorldPosition(aWorldPos.xyz);
30+
}
31+
32+
)";
33+
34+
35+
static const std::string depthVertexShader_Main = R"(
36+
in vec4 position;
37+
38+
// these are passed in from OF programmable renderer
39+
uniform mat4 modelMatrix;
40+
41+
void main() {
42+
vec3 worldPosition = (modelMatrix * vec4(position.xyz, 1.0)).xyz;
43+
sendShadowDepthWorldPosition(worldPosition);
44+
}
45+
3746
)";

0 commit comments

Comments
 (0)