make it fancy
This commit is contained in:
parent
59713405b1
commit
95642ae818
|
@ -1,22 +1,43 @@
|
|||
#version 330 core
|
||||
|
||||
in vec3 normal;
|
||||
in vec3 fragmentPosition;
|
||||
|
||||
|
||||
vec4 ambientLight = vec4(0.1, 0.1, 0.1, 1.0);
|
||||
vec4 surfaceColor = vec4(0.7, 0.7, 0.9, 1.0);
|
||||
uniform vec4 ambientColor;
|
||||
uniform vec4 diffusionColor;
|
||||
uniform vec4 specularColor;
|
||||
|
||||
vec3 lightPosition = vec3(3.0, 3.0, 3.0);
|
||||
vec4 lightColor = vec4(1.0, 1.0, 1.0, 1.0);
|
||||
uniform float shininess;
|
||||
|
||||
uniform vec4 ambientLight;
|
||||
uniform vec3 lightPosition;
|
||||
uniform vec4 lightColor;
|
||||
|
||||
|
||||
float emissionStrength = 0.1;
|
||||
float emissionStrength = 0.0;
|
||||
|
||||
|
||||
void main() {
|
||||
vec3 norm = normalize(normal);
|
||||
vec3 lightDir = normalize(lightPosition - fragmentPosition);
|
||||
vec3 eyeDir = -normalize(fragmentPosition);
|
||||
|
||||
float diff = max(dot(norm, lightDir), 0.0);
|
||||
|
||||
gl_FragColor = surfaceColor * emissionStrength + ambientLight * surfaceColor + diff * lightColor * surfaceColor;
|
||||
vec3 halfway = (lightDir + eyeDir) / length(lightDir + eyeDir);
|
||||
float specular = pow(max(dot(halfway, norm), 0.0), shininess);
|
||||
|
||||
gl_FragColor =
|
||||
// EMISSION
|
||||
diffusionColor * emissionStrength +
|
||||
|
||||
// // AMBIENT
|
||||
ambientLight * ambientColor +
|
||||
|
||||
// DIFFUSION
|
||||
diff * lightColor * diffusionColor +
|
||||
|
||||
// SPECULAR
|
||||
specular * lightColor * specularColor;
|
||||
}
|
|
@ -241,7 +241,7 @@ void draw(void) {
|
|||
// -------------- PROJECTION TRANSFORMATION ----------------
|
||||
mat4 projectionTransformation;
|
||||
GLfloat near = 0.1f;
|
||||
GLfloat far = 10.0f;
|
||||
GLfloat far = 20.0f;
|
||||
perspectiveProjection(&projectionTransformation, near, far);
|
||||
|
||||
|
||||
|
@ -252,11 +252,36 @@ void draw(void) {
|
|||
normalisedDeviceCoordinatesFov(&normalisationTransformation, fovy, aspectRatio, near, far);
|
||||
|
||||
|
||||
mat4 modelView;
|
||||
identity(&modelView);
|
||||
multiply(&modelView, &modelTransformation, &modelView);
|
||||
multiply(&modelView, &viewingTransformation, &modelView);
|
||||
|
||||
mat4 projection;
|
||||
identity(&projection);
|
||||
multiply(&projection, &projectionTransformation, &projection);
|
||||
multiply(&projection, &normalisationTransformation, &projection);
|
||||
|
||||
|
||||
// send transformation matrix to shader
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "modelTransformation"), 1, GL_FALSE, (GLfloat*)&modelTransformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "viewingTransformation"), 1, GL_FALSE, (GLfloat*)&viewingTransformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "projectionTransformation"), 1, GL_FALSE, (GLfloat*)&projectionTransformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "normalisationTransformation"), 1, GL_FALSE, (GLfloat*)&normalisationTransformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "modelView"), 1, GL_FALSE, (GLfloat*)&modelView);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "projection"), 1, GL_FALSE, (GLfloat*)&projection);
|
||||
|
||||
|
||||
vec4 lightPosition = {cos(stepi * 2) * 3.0f, 3.0f, sin(stepi * 2) * 3.0f, 1.0f};
|
||||
multiplyAny((GLfloat *)&lightPosition, (GLfloat *)&modelView, (GLfloat *)&lightPosition, 4, 4, 1);
|
||||
|
||||
glUniform3f(glGetUniformLocation(program, "lightPosition"), lightPosition.x, lightPosition.y, lightPosition.z);
|
||||
|
||||
// SET MATERIAL DATA
|
||||
glUniform4f(glGetUniformLocation(program, "ambientColor"), 0.25f, 0.22f, 0.06f, 1.0f);
|
||||
glUniform4f(glGetUniformLocation(program, "diffusionColor"), 0.35f, 0.31f, 0.09f, 1.0f);
|
||||
glUniform4f(glGetUniformLocation(program, "specularColor"), 0.80f, 0.72f, 0.21f, 1.0f);
|
||||
glUniform1f(glGetUniformLocation(program, "shininess"), 83.2f * 4.0f);
|
||||
|
||||
// SET LIGHT DATA
|
||||
glUniform4f(glGetUniformLocation(program, "lightColor"), 1.0f, 1.0f, 1.0f, 1.0f);
|
||||
glUniform4f(glGetUniformLocation(program, "ambientLight"), 0.2f, 0.2f, 0.2f, 1.0f);
|
||||
|
||||
// draw!!1
|
||||
glDrawArrays(GL_TRIANGLES, 0, numFaces * 3);
|
||||
|
|
|
@ -9,6 +9,13 @@ typedef struct {
|
|||
GLfloat z;
|
||||
} vec3;
|
||||
|
||||
typedef struct {
|
||||
GLfloat x;
|
||||
GLfloat y;
|
||||
GLfloat z;
|
||||
GLfloat w;
|
||||
} vec4;
|
||||
|
||||
typedef struct {
|
||||
GLfloat m00;
|
||||
GLfloat m10;
|
||||
|
|
|
@ -2,18 +2,16 @@
|
|||
layout (location = 0) in vec3 aPosition;
|
||||
layout (location = 1) in vec3 aNormal;
|
||||
|
||||
uniform mat4 modelTransformation;
|
||||
uniform mat4 viewingTransformation;
|
||||
uniform mat4 projectionTransformation;
|
||||
uniform mat4 normalisationTransformation;
|
||||
uniform mat4 modelView;
|
||||
uniform mat4 projection;
|
||||
|
||||
|
||||
// uniform mat4 modelTransformation;
|
||||
out vec3 normal;
|
||||
out vec3 fragmentPosition;
|
||||
void main() {
|
||||
normal = vec3(modelTransformation * vec4(aNormal, 1.0));
|
||||
normal = mat3(transpose(inverse(modelView))) * aNormal;
|
||||
|
||||
gl_Position = normalisationTransformation * projectionTransformation * viewingTransformation * modelTransformation * vec4(aPosition, 1.0);
|
||||
fragmentPosition = vec3(modelTransformation * vec4(aPosition, 1.0));
|
||||
gl_Position = projection * modelView * vec4(aPosition, 1.0);
|
||||
fragmentPosition = vec3(modelView * vec4(aPosition, 1.0));
|
||||
}
|
Loading…
Reference in New Issue