From a8b8bf1d5e08f56d0f71536889b691335435adfe Mon Sep 17 00:00:00 2001 From: knolax <1339802534.kk@gmail.com> Date: Fri, 10 Mar 2017 11:31:48 -0500 Subject: added magic code for second shader, prepared to be for shadow rendering, added roadmap --- example/fragmentshader.glsl | 6 +- example/fragmentshadowshader.glsl | 49 ++++++++ example/main | Bin 54360 -> 54872 bytes example/main.cpp | 9 ++ example/main.o | Bin 5904 -> 7256 bytes example/vertexshadowshader.glsl | 19 +++ glgfx.cpp | 256 ++++++++++++++++++++++++-------------- glgfx.h | 3 + glgfx.o | Bin 62960 -> 65176 bytes libglgfx.a | Bin 67374 -> 69812 bytes plan | 33 +++++ 11 files changed, 278 insertions(+), 97 deletions(-) create mode 100644 example/fragmentshadowshader.glsl create mode 100644 example/vertexshadowshader.glsl create mode 100644 plan diff --git a/example/fragmentshader.glsl b/example/fragmentshader.glsl index fc7b4c8..064dad6 100644 --- a/example/fragmentshader.glsl +++ b/example/fragmentshader.glsl @@ -36,9 +36,9 @@ void main() dist = 1.0; } dist = 1 - pow(dist, 4.0); - float lightr = (elevpix.b) * 1.0 * lightattrib.r * reflect + elevpix.a * 1.0 * dist * diffuse; - float lightg = (elevpix.b) * 1.0 * lightattrib.g * reflect + elevpix.a * 1.0 * dist * diffuse; - float lightb = (elevpix.b) * 1.0 * lightattrib.b * reflect + elevpix.a * 1.0 * dist * diffuse; + float lightr = (elevpix.b) * 0.5 * lightattrib.r * reflect + elevpix.a * 0.5 * dist * diffuse; + float lightg = (elevpix.b) * 0.5 * lightattrib.g * reflect + elevpix.a * 0.5 * dist * diffuse; + float lightb = (elevpix.b) * 0.5 * lightattrib.b * reflect + elevpix.a * 0.5 * dist * diffuse; vec4 texpix = texture(tex, fragtexcoord); //this should be the vertex in camera space without the w value //outpix = gl_FragCoord; diff --git a/example/fragmentshadowshader.glsl b/example/fragmentshadowshader.glsl new file mode 100644 index 0000000..4e551c4 --- /dev/null +++ b/example/fragmentshadowshader.glsl @@ -0,0 +1,49 @@ +#version 130 +out vec4 outpix; +uniform vec3 campos; +uniform vec3 lightpos; +uniform vec4 lightattrib; +uniform sampler2D tex; +uniform sampler2D elev; +//varing blends them it is transformed to world space +varying vec4 fragpos; +varying vec4 fragnormal; +varying vec2 fragtexcoord; +void main() +{ + vec4 elevpix = texture(elev, fragtexcoord); + //the format is diffuse reflect and percent + vec3 difpos = vec3(fragpos.xyz) + ((elevpix.r - .5) * 2 * fragnormal.xyz); + vec3 refpos = vec3(fragpos.xyz) + ((elevpix.g - .5) * 2 * fragnormal.xyz); + vec3 lightnormal = normalize((lightpos - difpos)); + float diffuse = dot(lightnormal, fragnormal.xyz); + if (diffuse < 0.0) { + diffuse = 0.0; + } else { + } + vec3 camnormal = normalize(campos - refpos); + lightnormal = normalize((refpos - lightpos)); // this time it is an incoming vector + vec3 refnormal = lightnormal - (2 * dot(lightnormal, fragnormal.xyz) * fragnormal.xyz); + float reflect = dot(camnormal, refnormal); + if (reflect < 0.0) { + reflect = 0.0; + } else { + } + diffuse = pow(diffuse, 2.0); + reflect = pow(reflect, 2.0); + float dist = abs(length(difpos - lightpos)) / lightattrib.a; + if (dist > 1.0) { + dist = 1.0; + } + dist = 1 - pow(dist, 4.0); + float lightr = (elevpix.b) * 0.5 * lightattrib.r * reflect + elevpix.a * 0.5 * dist * diffuse; + float lightg = (elevpix.b) * 1.0 * lightattrib.g * reflect + elevpix.a * 1.0 * dist * diffuse; + float lightb = (elevpix.b) * 0.5 * lightattrib.b * reflect + elevpix.a * 0.5 * dist * diffuse; + vec4 texpix = texture(tex, fragtexcoord); + //this should be the vertex in camera space without the w value + //outpix = gl_FragCoord; + outpix = vec4(lightr * texpix.r, lightg * texpix.g, lightb * texpix.b, texpix.a); + //outpix = vec4(light * 1.0,light * 1.0,light * 1.0, 1.0); + //outpix = vec4(fragpos.x ,fragpos.y ,fragpos.z, 0.5); + //outpix = vec4(fragnormal.x, fragnormal.y, fragnormal.z, 0.5); +} diff --git a/example/main b/example/main index 9f2411e..84014cc 100755 Binary files a/example/main and b/example/main differ diff --git a/example/main.cpp b/example/main.cpp index 6b7975c..476f4d7 100644 --- a/example/main.cpp +++ b/example/main.cpp @@ -40,14 +40,23 @@ int main (int argc, char * argv[]) { } switch (rot) { case 0: + useregshaders(); + setlight(2.0,10.0,3.0, 1.0, 0.5, 0.5, 15.0); + setcam(0.0,0.0,1.0, 0.0,0.0,0.0, 0.0,1.0,0.0); drawmodel(0.0f, 0.0f, -2.0f, dir, 0.0f, 0.0f, 1.0, 1.0, 1.0); drawmodel(0.5f, 3.0f, -10.0f, dir, 0.0f, 0.0f, 1.0, 1.0, 1.0); break; case 1: + useshadowshaders(); + setlight(2.0,10.0,3.0, 1.0, 0.5, 0.5, 15.0); + setcam(0.0,0.0,1.0, 0.0,0.0,0.0, 0.0,1.0,0.0); drawmodel(0.0f, 0.0f, -2.0f, 0.0f, dir, 0.0f, 1.0, 1.0, 1.0); drawmodel(0.5f, 3.0f, -10.0f, 0.0f, dir, 0.0f, 1.0, 1.0, 1.0); break; case 2: + useregshaders(); + setlight(2.0,10.0,3.0, 1.0, 0.5, 0.5, 15.0); + setcam(0.0,0.0,1.0, 0.0,0.0,0.0, 0.0,1.0,0.0); drawmodel(0.0f, 0.0f, -2.0f, 0.0f, 0.0f, dir, 1.0, 1.0, 1.0); drawmodel(0.5f, 3.0f, -10.0f, 0.0f, 0.0f, dir, 1.0, 1.0, 1.0); break; diff --git a/example/main.o b/example/main.o index c6267ba..dd10363 100644 Binary files a/example/main.o and b/example/main.o differ diff --git a/example/vertexshadowshader.glsl b/example/vertexshadowshader.glsl new file mode 100644 index 0000000..8ba8228 --- /dev/null +++ b/example/vertexshadowshader.glsl @@ -0,0 +1,19 @@ +#version 130 +uniform mat4 proj; +uniform mat4 tran; +uniform mat4 cam; +uniform mat4 rot; +in vec3 position; +in vec3 vnormal; +in vec3 texcoord; +varying vec4 fragpos; +varying vec4 fragnormal; // if this needs to not be blended jsut have all vertexes in a poly be the same +varying vec2 fragtexcoord; +void main() +{ + //this is the actual position + gl_Position = proj * cam * tran * vec4(position, 1.0f);// - vec4(gl_Normal, 1.0f); + fragpos = tran * vec4(position, 1.0f); + fragnormal = (tran * vec4(vnormal, 1.0f)) - (tran * vec4(0.0, 0.0, 0.0, 1.0)); + fragtexcoord = texcoord.xy; +} diff --git a/glgfx.cpp b/glgfx.cpp index f3cdec9..2983391 100644 --- a/glgfx.cpp +++ b/glgfx.cpp @@ -25,6 +25,10 @@ GLint lightattribhandler; GLuint vertexshaderhandle; GLuint fragmentshaderhandle; GLuint shaderprogramhandle; +GLuint vertexshadowshaderhandle; +GLuint fragmentshadowshaderhandle; +GLuint shadowshaderprogramhandle; +GLuint geomshadowshaderhandle; int initglgfx() { //glew is the library that links all of opengl's fnctions //for you @@ -39,24 +43,7 @@ int initglgfx() { glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); - GLuint glnum; - glGenBuffers(1, &glnum); - printf("%u\n",glnum); - //vertex data load of the box model -/* float vertexdata[] = { --0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, --0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, -0.500000,0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 1.000000,0.000000,0.000000, 0.500000,-0.500000,0.500000, 1.000000,0.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, --0.500000,0.500000,0.500000, 0.000000,0.000000,1.000000, -0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, 0.500000,-0.500000,0.500000, 0.000000,0.000000,1.000000, --0.500000,0.500000,0.500000, -1.000000,0.000000,0.000000, -0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, --0.500000,0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, -1.000000,0.000000,0.000000, -0.500000,-0.500000,0.500000, -1.000000,0.000000,0.000000, --0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, -0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, 0.500000,-0.500000,0.500000, 0.000000,-1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,-1.000000,0.000000, --0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, - };*/ + float vertexdata[] = { -0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,1.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,0.000000,0.000000, -0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 0.000000,0.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,1.000000,0.000000, 0.500000,-0.500000,-0.500000, 0.000000,0.000000,-1.000000, 1.000000,0.000000,0.000000, @@ -71,47 +58,7 @@ int initglgfx() { -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000, -0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,0.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,0.500000,0.500000, 0.000000,1.000000,0.000000, 1.000000,1.000000,0.000000, 0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,1.000000,0.000000, -0.500000,0.500000,-0.500000, 0.000000,1.000000,0.000000, 0.000000,0.000000,0.000000, }; -/* float vertexdata[] = { - -0.5, 0.5, -.5, // x y z - 0.5, 0.5, -.5, - 0.5, -0.5, -.5, - -0.5, -0.5, -.5, - -0.5, 0.5, 0.5, // x y z - 0.5, 0.5, 0.5, - 0.5, -0.5, 0.5, - -0.5, -0.5, 0.5, - //normal positions - 1.0, 0.0, 0.0, - -1.0, 0.0, 0.0, - 0.0, 1.0, 0.0, - 0.0, -1.0, 0.0, - 0.0, 0.0, 1.0, - 0.0, 0.0, -1.0, - }; -*/ - //polygons of the box mode based on the vertex data. - //they must be clockwise from the front so that they are culled when not - //seen -/* GLuint elementdata[] = { - 0,12, 1,12, 3,12, - 3,12, 1,12, 2,12, - - 1,8, 5,8, 2,8, - 2,8, 5,8, 6,8, - - 5,13, 4,13, 6,13, - 4,13, 7,13, 6,13, - - 4,9, 0,9, 7,9, - 0,9, 3,9, 7,9, - - 3,11, 6,11, 7,11, - 2,11, 6,11, 3,11, - 0,10, 4,10, 5,10, - 5,10, 1,10, 0,10, - }; -*/ GLuint elementdata[] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35 }; @@ -132,10 +79,26 @@ int initglgfx() { glgfxloadtexture("textures/elev.bmp"); //loads the shaders genshaders(); - glUniform1i(glGetUniformLocation(shaderprogramhandle, "tex"), 0); - glUniform1i(glGetUniformLocation(shaderprogramhandle, "elev"), 1); + genshadowshaders(); } //loads shaders and models +GLuint loadshaderscript(const char * file, GLenum type) { + std::string source = readfile(file).c_str(); + const char * shaderstr = source.c_str(); + GLuint handle = glCreateShader(type); + int len = source.length(); + glShaderSource(handle, 1, (&shaderstr), &len); + glCompileShader(handle); + char buffer[512]; + GLint err; + glGetShaderiv(handle, GL_COMPILE_STATUS, &err); + if (err == false) { + glGetShaderInfoLog(handle, 512, NULL, buffer); + printf("error compiling shader in file : %s\n", file); + printf(buffer); + } + return handle; +} int genshaders() { //flowchart //vertex shader receives raw vertex data, outputs that data transformed in 3d space(camera), that data is passed to @@ -145,40 +108,13 @@ int genshaders() { //then passed to fragment shader //which is where we do the light calculations //tests and blending(multiple buffers?) - //reads from files - //debug printout - //printf(readfile("vertexshader.glsl").c_str()); - std::string vertexshadersource = readfile("vertexshader.glsl").c_str(); - std::string fragmentshadersource = readfile("fragmentshader.glsl").c_str(); - const char * vertexshaderstr = vertexshadersource.c_str(); - const char * fragmentshaderstr = fragmentshadersource.c_str(); - GLuint vertexshaderhandle = glCreateShader(GL_VERTEX_SHADER); - int vertexshaderlen = vertexshadersource.length(); - //length of the source must be specified - glShaderSource(vertexshaderhandle, 1, (&vertexshaderstr), &vertexshaderlen); - glCompileShader(vertexshaderhandle); - //error buffer - char buffer[512]; - GLint err; - glGetShaderiv(vertexshaderhandle, GL_COMPILE_STATUS, &err); - if (err == GL_FALSE) { - glGetShaderInfoLog(vertexshaderhandle, 512, NULL, buffer); - printf("error compiling vertex shhader\n"); - printf(buffer); - } - - GLuint fragmentshaderhandle = glCreateShader(GL_FRAGMENT_SHADER); - int fragmentshaderlen = fragmentshadersource.length(); - //the length of the source must be specified - glShaderSource(fragmentshaderhandle, 1, (&fragmentshaderstr), &fragmentshaderlen); - glCompileShader(fragmentshaderhandle); - glGetShaderiv(fragmentshaderhandle, GL_COMPILE_STATUS, &err); - if (err == GL_FALSE) { - glGetShaderInfoLog(fragmentshaderhandle, 512, NULL, buffer); - printf("error compiling fragment shader\n"); - printf(buffer); - } - //make the shader program + //---=[make the shader program]=--- + //| | + //| | + //--------------------------------- + GLuint vertexshaderhandle = loadshaderscript("vertexshader.glsl", GL_VERTEX_SHADER); + GLuint fragmentshaderhandle = loadshaderscript("fragmentshader.glsl", GL_FRAGMENT_SHADER); + //GLuint vertexshaderhandle = loadshaderscript("vertexshader.glsl", GL_VERTEX_SHADER); shaderprogramhandle = glCreateProgram(); glAttachShader(shaderprogramhandle,vertexshaderhandle); glAttachShader(shaderprogramhandle,fragmentshaderhandle); @@ -186,6 +122,10 @@ int genshaders() { glBindFragDataLocation(shaderprogramhandle,0,"outpix"); glLinkProgram(shaderprogramhandle); glUseProgram(shaderprogramhandle); + //---=[vertex data format declaration]=--- + //| | + //| | + //---------------------------------------- //vertex data GLint pos; pos = glGetAttribLocation(shaderprogramhandle, "position"); @@ -205,7 +145,105 @@ int genshaders() { //number of bytes between values, offset from beginning in bytes glVertexAttribPointer(texcoord, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (6 * sizeof(float)) ); glEnableVertexAttribArray(texcoord); + //---=[uniform handler loading]=--- + //| | + //| | + //--------------------------------- + //getting uniform handler + glUniform1i(glGetUniformLocation(shaderprogramhandle, "tex"), 0); + glUniform1i(glGetUniformLocation(shaderprogramhandle, "elev"), 1); + /*projhandler = glGetUniformLocation(shaderprogramhandle, "proj"); + camhandler = glGetUniformLocation(shaderprogramhandle, "cam"); + tranhandler = glGetUniformLocation(shaderprogramhandle, "tran"); + rothandler = glGetUniformLocation(shaderprogramhandle, "rot"); + lightposhandler = glGetUniformLocation(shaderprogramhandle, "lightpos"); + camposhandler = glGetUniformLocation(shaderprogramhandle, "campos"); + lightattribhandler = glGetUniformLocation(shaderprogramhandle, "lightattrib");*/ +} + +int genshadowshaders() { +//flowchart +//vertex shadowshader receives raw vertex data, outputs that data transformed in 3d space(camera), that data is passed to +//geometry shadowshader, which is where we will add normal vector for +//light calculations // also where we make the volumetric information +//all these are rasterized, and blended for every pixel value +//then passed to fragment shadowshader +//which is where we do the light calculations +//tests and blending(multiple buffers?) + //---=[make the shadowshader program]=--- + //| | + //| | + //--------------------------------- + GLuint vertexshadowshaderhandle = loadshaderscript("vertexshadowshader.glsl", GL_VERTEX_SHADER); + GLuint fragmentshadowshaderhandle = loadshaderscript("fragmentshadowshader.glsl", GL_FRAGMENT_SHADER); + //GLuint vertexshadowshaderhandle = loadshaderscript("vertexshader.glsl", GL_VERTEX_SHADER); + shadowshaderprogramhandle = glCreateProgram(); + glAttachShader(shadowshaderprogramhandle,vertexshadowshaderhandle); + glAttachShader(shadowshaderprogramhandle,fragmentshadowshaderhandle); + //the 0 is which buffer, 0 is the default, 1 will be fore volumetric shading + glBindFragDataLocation(shadowshaderprogramhandle,0,"outpix"); + glLinkProgram(shadowshaderprogramhandle); + glUseProgram(shadowshaderprogramhandle); + //---=[vertex data format declaration]=--- + //| | + //| | + //---------------------------------------- + //vertex data + GLint pos; + pos = glGetAttribLocation(shadowshaderprogramhandle, "position"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), 0); + glEnableVertexAttribArray(pos); + GLint vnorm; + vnorm = glGetAttribLocation(shadowshaderprogramhandle, "vnormal"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(vnorm, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (3 * sizeof(float)) ); + glEnableVertexAttribArray(vnorm); + GLint texcoord; + texcoord = glGetAttribLocation(shadowshaderprogramhandle, "texcoord"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(texcoord, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (6 * sizeof(float)) ); + glEnableVertexAttribArray(texcoord); + //---=[uniform handler loading]=--- + //| | + //| | + //--------------------------------- //getting uniform handler + glUniform1i(glGetUniformLocation(shadowshaderprogramhandle, "tex"), 0); + glUniform1i(glGetUniformLocation(shadowshaderprogramhandle, "elev"), 1); + /*projhandler = glGetUniformLocation(shadowshaderprogramhandle, "proj"); + camhandler = glGetUniformLocation(shadowshaderprogramhandle, "cam"); + tranhandler = glGetUniformLocation(shadowshaderprogramhandle, "tran"); + rothandler = glGetUniformLocation(shadowshaderprogramhandle, "rot"); + lightposhandler = glGetUniformLocation(shadowshaderprogramhandle, "lightpos"); + camposhandler = glGetUniformLocation(shadowshaderprogramhandle, "campos"); + lightattribhandler = glGetUniformLocation(shadowshaderprogramhandle, "lightattrib");*/ +} +int useregshaders () { + glUseProgram(shaderprogramhandle); + /*GLint pos; + pos = glGetAttribLocation(shaderprogramhandle, "position"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), 0); + glEnableVertexAttribArray(pos); + GLint vnorm; + vnorm = glGetAttribLocation(shaderprogramhandle, "vnormal"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(vnorm, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (3 * sizeof(float)) ); + glEnableVertexAttribArray(vnorm); + GLint texcoord; + texcoord = glGetAttribLocation(shaderprogramhandle, "texcoord"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(texcoord, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (6 * sizeof(float)) ); + glEnableVertexAttribArray(texcoord); */ + //glUniform1i(glGetUniformLocation(shaderprogramhandle, "tex"), 0); + //glUniform1i(glGetUniformLocation(shaderprogramhandle, "elev"), 1); projhandler = glGetUniformLocation(shaderprogramhandle, "proj"); camhandler = glGetUniformLocation(shaderprogramhandle, "cam"); tranhandler = glGetUniformLocation(shaderprogramhandle, "tran"); @@ -214,6 +252,36 @@ int genshaders() { camposhandler = glGetUniformLocation(shaderprogramhandle, "campos"); lightattribhandler = glGetUniformLocation(shaderprogramhandle, "lightattrib"); } +int useshadowshaders() { + glUseProgram(shadowshaderprogramhandle); + /*GLint pos; + pos = glGetAttribLocation(shadowshaderprogramhandle, "position"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(pos, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), 0); + glEnableVertexAttribArray(pos); + GLint vnorm; + vnorm = glGetAttribLocation(shadowshaderprogramhandle, "vnormal"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(vnorm, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (3 * sizeof(float)) ); + glEnableVertexAttribArray(vnorm); + GLint texcoord; + texcoord = glGetAttribLocation(shadowshaderprogramhandle, "texcoord"); + //the actual atribute, number of values, type, whether they need to be normalied to -1 1, + //number of bytes between values, offset from beginning in bytes + glVertexAttribPointer(texcoord, 3, GL_FLOAT, GL_FALSE, 9 * sizeof(float), (void *) (6 * sizeof(float)) ); + glEnableVertexAttribArray(texcoord);*/ + //glUniform1i(glGetUniformLocation(shadowshaderprogramhandle, "tex"), 0); + //glUniform1i(glGetUniformLocation(shadowshaderprogramhandle, "elev"), 1); + projhandler = glGetUniformLocation(shadowshaderprogramhandle, "proj"); + camhandler = glGetUniformLocation(shadowshaderprogramhandle, "cam"); + tranhandler = glGetUniformLocation(shadowshaderprogramhandle, "tran"); + rothandler = glGetUniformLocation(shadowshaderprogramhandle, "rot"); + lightposhandler = glGetUniformLocation(shadowshaderprogramhandle, "lightpos"); + camposhandler = glGetUniformLocation(shadowshaderprogramhandle, "campos"); + lightattribhandler = glGetUniformLocation(shadowshaderprogramhandle, "lightattrib"); +} //opens a filebuffer stream and reads every char std::string readfile(char const * filename) { std::ifstream filebuffer; diff --git a/glgfx.h b/glgfx.h index 8d0137a..e036c4c 100644 --- a/glgfx.h +++ b/glgfx.h @@ -11,6 +11,9 @@ #include int initglgfx(); int genshaders(); +int genshadowshaders(); +int useregshaders(); +int useshadowshaders(); int drawmodel(float x, float y, float z, float xr, float yr, float zr, float xs, float ys, float zs); int setcam (float cpx, float cpy, float cpz, float clx, float cly, float clz, float cux, float cuy, float cuz); int setlight (float x, float y, float z, float r, float g, float b, float lim); diff --git a/glgfx.o b/glgfx.o index f5a2f42..83d37d2 100644 Binary files a/glgfx.o and b/glgfx.o differ diff --git a/libglgfx.a b/libglgfx.a index 0dadadc..feccf89 100644 Binary files a/libglgfx.a and b/libglgfx.a differ diff --git a/plan b/plan new file mode 100644 index 0000000..26410b3 --- /dev/null +++ b/plan @@ -0,0 +1,33 @@ +the plan +-regular draw shader program[0] +-geometry sahder, expand geometry to add polygons that smooth out curves[0.0] +-vertex shader, move to world and camera space, pass world space to shader[0.1] X +-load texture and elevation data[2] X +-fragment shader, process elevation mad to adjust the fragment position in world space,[0.3] X +-and change the normal based on vector of where y+ on the texture is and the polygon normal[0.4] +-use reflection of light across normal, and angle of that from camera to do reflect lighting[0.5] X +-use angle of normal from angle of light to do diffuse lighting[6] X + +lighting[1] +-decrease light itensity as log of max distance[1.0] X +-colored lighting[1.1] X +-when below a percentage of max distance, lets say 5%, will use an array or constant set of 16 world space coordinates, each acting as 1/16 if the light intensity. [1.3] + +Shadows[2] +-create second shader program[2.0] X +-use geometry shader to draw shadow "box" that radiates away from light source, ending at light source limit + some buffer constant[2.1] +-since they should not overlap, we do not have to owrry about shadow boxes in boxs, therefore all boxes should be backpolygon frontpolygon, have two 8 bit buffers, with highest bit being xor'd with 1 every time. starting as 0, it it ends up 1, draw solid shadow[2.2] +-create a new render buffer buffers, for all pixels where the original buffer was 1, draw based on depth buffer of original render buffer, write z level and dist from polygon(generated in geometry) of highest backpoly up below depth and lowest frontpoly above depth, compare with z level of original buffer to generate compiste distance, shade darkness accordingly[2.3] +particles[3] +-draw random particles, point or triangle, near light sources, or based on world coordinate make a static particle with geometry shader[3.0] + +non opaque objects[4] +-draw opaque and non opaque objects when drawing shadows, then draw opaque objects, draw non opaque objects this does not apply shadows to non opaque objects [4.0]. +-draw opaque objects into buffer[4.1] +-then for every non opaque object, draw based on depth buffer of that, apply shadows and draw over,in order of distance from camera[4.2] +-based on normal from camera and index of refraction, shift linearly in a simple fashion from previous buffer with non opaques[4.3] + +misc[5] +-re do box[5.0] +-do circle, full poly if geometry not implemented[5.1] +-added gfx textures[5.2] and coresponding backlight[5.2] -- cgit v1.1