summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorknolax <1339802534.kk@gmail.com>2017-03-10 11:31:48 -0500
committerknolax <1339802534.kk@gmail.com>2017-03-10 11:31:48 -0500
commita8b8bf1d5e08f56d0f71536889b691335435adfe (patch)
tree1f91b891c8283b02c233df658ae96717f7ab6cd1
parent21f3329340ccd9a8c42335f84b34d3f7e4a2e99a (diff)
added magic code for second shader, prepared to be for shadow rendering, added roadmap
-rw-r--r--example/fragmentshader.glsl6
-rw-r--r--example/fragmentshadowshader.glsl49
-rwxr-xr-xexample/mainbin54360 -> 54872 bytes
-rw-r--r--example/main.cpp9
-rw-r--r--example/main.obin5904 -> 7256 bytes
-rw-r--r--example/vertexshadowshader.glsl19
-rw-r--r--glgfx.cpp256
-rw-r--r--glgfx.h3
-rw-r--r--glgfx.obin62960 -> 65176 bytes
-rw-r--r--libglgfx.abin67374 -> 69812 bytes
-rw-r--r--plan33
11 files changed, 278 insertions, 97 deletions
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
--- a/example/main
+++ b/example/main
Binary files 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
--- a/example/main.o
+++ b/example/main.o
Binary files 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 <glm/gtc/type_ptr.hpp>
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
--- a/glgfx.o
+++ b/glgfx.o
Binary files differ
diff --git a/libglgfx.a b/libglgfx.a
index 0dadadc..feccf89 100644
--- a/libglgfx.a
+++ b/libglgfx.a
Binary files 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]