Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- float f;
- vec3 edge1, edge2, tangentbuf;
- vec2 deltaUV1, deltaUV2;
- //for each face, x=vert,y=uv, z=normal
- for (size_t i = 0; i < totalrefs.size(); i += 9)
- {
- edge1 = verticeref[totalrefs[i + 3] - 1] - verticeref[totalrefs[i] - 1];
- edge2 = verticeref[totalrefs[i + 6] - 1] - verticeref[totalrefs[i] - 1];
- deltaUV1 = texkoordref[totalrefs[i + 4] - 1] - texkoordref[totalrefs[i + 1] - 1];
- deltaUV2 = texkoordref[totalrefs[i + 7] - 1] - texkoordref[totalrefs[i + 1] - 1];
- f = 1.0f / (deltaUV1.x * deltaUV2.y - deltaUV2.x * deltaUV1.y);
- tangentbuf = f*vec3(
- (deltaUV2.y * edge1.x - deltaUV1.y * edge2.x),
- (deltaUV2.y * edge1.y - deltaUV1.y * edge2.y),
- (deltaUV2.y * edge1.z - deltaUV1.y * edge2.z));
- normalize(tangentref[tangentcount++]);
- tangentref[totalrefs[i] - 1] += vec4(normalize(tangentbuf), 1);
- tangentref[totalrefs[i + 3] - 1] += vec4(normalize(tangentbuf), 1);
- tangentref[totalrefs[i + 6] - 1] += vec4(normalize(tangentbuf), 1);
- }
- //for (auto &x : tangentref)x = normalize(x / x.w); //find average
- for (auto &x : tangentref)x = normalize(x); //just normalize is enough?
- #version 400
- layout ( location = 0 ) in vec3 vertex_position;
- layout ( location = 1 ) in vec2 tex_cord;
- layout ( location = 2 ) in vec3 vertex_normal;
- layout ( location = 3 ) in vec3 vertex_tangent;
- uniform mat4 modelviewmatrix; //view*model matrix
- uniform mat3 normalmatrix; // transpose/invert(view*model)
- uniform mat4 priv_mat; //projection-view-model pre multiplied
- uniform vec4 LightPosition; //after view*lightpos, aka viewspace
- out vec2 fUV; //fragment uv
- out vec3 lightdir; //tangent lightdir
- out vec3 viewdir; //tangent viewdir
- void main()
- {
- vec3 norm = normalize(normalmatrix*vertex_normal);
- vec3 tang = normalize(normalmatrix*vec3(vertex_tangent));
- tang = normalize(tang - dot(tang, norm) * norm); //Gramm-Schmidt
- vec3 binormal = normalize(cross(norm,tang));
- //matrix for transformation to tangent space
- mat3 tbn=mat3(tang,binormal,norm);
- //turn light dir and view dir to tangent space
- vec3 pos = vec3(modelviewmatrix*vec4(vertex_position,1.0));
- lightdir = normalize(tbn*(LightPosition.xyz-pos));
- viewdir =tbn*normalize(-pos); //tangent view
- fUV = tex_cord; //uv
- gl_Position = priv_mat*vec4(vertex_position,1.0); //model
- }
- #version 400
- in vec2 fUV;
- in vec3 lightdir; //tang light
- in vec3 viewdir; //tang view
- uniform sampler2D png_tex;
- uniform sampler2D bump_map;
- uniform vec3 LightIntensity;
- uniform vec3 Kd; // Diffuse reflectivity
- uniform vec3 Ka; // Ambient reflectivity
- uniform vec3 Ks; // Specular reflectivity
- uniform float Shininess; // Specular shininess factor
- out vec4 Color;
- vec3 phongmodel(vec3 norm, vec3 diffr){
- vec3 r=reflect(-lightdir,norm);
- vec3 ambient = LightIntensity*Ka;
- float sdotn = max(dot(lightdir,norm),0.0);
- vec3 diffuse = LightIntensity*diffr*sdotn;
- vec3 spec = vec3(0.0);
- if(sdotn>0.0)
- spec = LightIntensity*Ks*pow(max(dot(r,viewdir),0.0),Shininess);
- return ambient+diffuse+spec;
- }
- void main()
- {
- vec4 bump_normal=texture(bump_map, fUV);
- vec4 tex_color=texture(png_tex,fUV);
- Color = vec4(phongmodel(bump_normal.xyz,tex_color.rgb),1.0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement