Start first task
This commit is contained in:
parent
166e697630
commit
f27795b697
10 changed files with 190 additions and 16 deletions
7
.vscode/settings.json
vendored
7
.vscode/settings.json
vendored
|
@ -1 +1,6 @@
|
||||||
{}
|
{
|
||||||
|
"files.associations": {
|
||||||
|
"bitset": "cpp",
|
||||||
|
"chrono": "cpp"
|
||||||
|
}
|
||||||
|
}
|
21
exercise2/glsl/old_sky.frag
Normal file
21
exercise2/glsl/old_sky.frag
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
|
// chair of the TU Dresden. Do not distribute!
|
||||||
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
in vec4 clipPos;
|
||||||
|
|
||||||
|
const vec4 horizon = vec4(0.85, 0.85, 0.8, 1.0);
|
||||||
|
const vec4 floor = vec4(0.1, 0.1, 0.1, 1.0);
|
||||||
|
const vec4 sky = vec4(0.5, 0.6, 0.8, 1.0);
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
float h = normalize(clipPos.xyz).y;
|
||||||
|
if(h < 0)
|
||||||
|
color = mix(horizon, floor, pow(-h, 0.5));
|
||||||
|
else
|
||||||
|
color = mix(horizon, sky, pow(h, 0.9));
|
||||||
|
}
|
19
exercise2/glsl/old_sky.vert
Normal file
19
exercise2/glsl/old_sky.vert
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
|
// chair of the TU Dresden. Do not distribute!
|
||||||
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
uniform mat4 mvp;
|
||||||
|
|
||||||
|
out vec4 clipPos;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
clipPos = vec4( float((gl_VertexID << 1) & 2) - 1.0,
|
||||||
|
float((gl_VertexID + 1) & 2) - 1.0,
|
||||||
|
float( gl_VertexID & 2) - 1.0,
|
||||||
|
1.0);
|
||||||
|
|
||||||
|
gl_Position = mvp * clipPos;
|
||||||
|
gl_Position.z = 0.5 * gl_Position.w;
|
||||||
|
}
|
49
exercise2/glsl/old_terrain.frag
Normal file
49
exercise2/glsl/old_terrain.frag
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
|
// chair of the TU Dresden. Do not distribute!
|
||||||
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
out vec4 color;
|
||||||
|
|
||||||
|
uniform vec3 cameraPos;
|
||||||
|
|
||||||
|
|
||||||
|
uniform sampler2D background;
|
||||||
|
uniform vec2 screenSize;
|
||||||
|
|
||||||
|
const vec3 dirToLight = normalize(vec3(1, 3, 1));
|
||||||
|
|
||||||
|
//Calculates the visible surface color based on the Blinn-Phong illumination model
|
||||||
|
vec4 calculateLighting(vec4 materialColor, float specularIntensity, vec3 normalizedNormal, vec3 directionToViewer)
|
||||||
|
{
|
||||||
|
vec4 color = materialColor;
|
||||||
|
vec3 h = normalize(dirToLight + directionToViewer);
|
||||||
|
color.xyz *= 0.9 * max(dot(normalizedNormal, dirToLight), 0) + 0.1;
|
||||||
|
color.xyz += specularIntensity * pow(max(dot(h, normalizedNormal), 0), 50);
|
||||||
|
return color;
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 getBackgroundColor()
|
||||||
|
{
|
||||||
|
return texture(background, gl_FragCoord.xy / screenSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
//surface geometry
|
||||||
|
vec3 n = vec3(0, 1, 0);
|
||||||
|
vec3 dirToViewer = vec3(0, 1, 0);
|
||||||
|
|
||||||
|
//material properties
|
||||||
|
color = vec4(0.6, 0.6, 0.6, 1);
|
||||||
|
float specular = 0;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//Calculate light
|
||||||
|
color = calculateLighting(color, specular, n, dirToViewer);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
58
exercise2/glsl/old_terrain.vert
Normal file
58
exercise2/glsl/old_terrain.vert
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
|
// chair of the TU Dresden. Do not distribute!
|
||||||
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
|
#version 330
|
||||||
|
|
||||||
|
in vec4 position;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uniform mat4 mvp;
|
||||||
|
|
||||||
|
//Returns the height of the procedural terrain at a given xz position
|
||||||
|
float getTerrainHeight(vec2 p);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
gl_Position = mvp * position;
|
||||||
|
}
|
||||||
|
|
||||||
|
//source: https://gist.github.com/patriciogonzalezvivo/670c22f3966e662d2f83
|
||||||
|
float rand(vec2 c)
|
||||||
|
{
|
||||||
|
return 2 * fract(sin(dot(c.xy ,vec2(12.9898,78.233))) * 43758.5453) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
float perlinNoise(vec2 p )
|
||||||
|
{
|
||||||
|
vec2 ij = floor(p);
|
||||||
|
vec2 xy = p - ij;
|
||||||
|
//xy = 3.*xy*xy-2.*xy*xy*xy;
|
||||||
|
xy = .5*(1.-cos(3.1415926 * xy));
|
||||||
|
float a = rand((ij+vec2(0.,0.)));
|
||||||
|
float b = rand((ij+vec2(1.,0.)));
|
||||||
|
float c = rand((ij+vec2(0.,1.)));
|
||||||
|
float d = rand((ij+vec2(1.,1.)));
|
||||||
|
float x1 = mix(a, b, xy.x);
|
||||||
|
float x2 = mix(c, d, xy.x);
|
||||||
|
return mix(x1, x2, xy.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
//based on https://www.seedofandromeda.com/blogs/58-procedural-heightmap-terrain-generation
|
||||||
|
float getTerrainHeight(vec2 p)
|
||||||
|
{
|
||||||
|
float total = 0.0;
|
||||||
|
float maxAmplitude = 0.0;
|
||||||
|
float amplitude = 1.0;
|
||||||
|
float frequency = 0.02;
|
||||||
|
for (int i = 0; i < 11; i++)
|
||||||
|
{
|
||||||
|
total += ((1.0 - abs(perlinNoise(p * frequency))) * 2.0 - 1.0) * amplitude;
|
||||||
|
frequency *= 2.0;
|
||||||
|
maxAmplitude += amplitude;
|
||||||
|
amplitude *= 0.45;
|
||||||
|
}
|
||||||
|
return 15 * total / maxAmplitude;
|
||||||
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
|
#version 330
|
||||||
// This source code is property of the Computer Graphics and Visualization
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
// chair of the TU Dresden. Do not distribute!
|
// chair of the TU Dresden. Do not distribute!
|
||||||
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
#version 330
|
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
|
@ -18,4 +18,4 @@ void main()
|
||||||
color = mix(horizon, floor, pow(-h, 0.5));
|
color = mix(horizon, floor, pow(-h, 0.5));
|
||||||
else
|
else
|
||||||
color = mix(horizon, sky, pow(h, 0.9));
|
color = mix(horizon, sky, pow(h, 0.9));
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
|
#version 330
|
||||||
// This source code is property of the Computer Graphics and Visualization
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
// chair of the TU Dresden. Do not distribute!
|
// chair of the TU Dresden. Do not distribute!
|
||||||
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
#version 330
|
|
||||||
|
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
|
|
||||||
|
@ -16,4 +16,4 @@ void main()
|
||||||
|
|
||||||
gl_Position = mvp * clipPos;
|
gl_Position = mvp * clipPos;
|
||||||
gl_Position.z = 0.5 * gl_Position.w;
|
gl_Position.z = 0.5 * gl_Position.w;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,9 +1,7 @@
|
||||||
// This source code is property of the Computer Graphics and Visualization
|
#version 330
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
// chair of the TU Dresden. Do not distribute!
|
// chair of the TU Dresden. Do not distribute!
|
||||||
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
#version 330
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
|
@ -46,4 +44,4 @@ void main()
|
||||||
color = calculateLighting(color, specular, n, dirToViewer);
|
color = calculateLighting(color, specular, n, dirToViewer);
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// This source code is property of the Computer Graphics and Visualization
|
#version 330
|
||||||
|
// This source code is property of the Computer Graphics and Visualization
|
||||||
// chair of the TU Dresden. Do not distribute!
|
// chair of the TU Dresden. Do not distribute!
|
||||||
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
// Copyright (C) CGV TU Dresden - All Rights Reserved
|
||||||
#version 330
|
|
||||||
|
|
||||||
in vec4 position;
|
in vec4 position;
|
||||||
|
|
||||||
|
@ -55,4 +55,4 @@ float getTerrainHeight(vec2 p)
|
||||||
amplitude *= 0.45;
|
amplitude *= 0.45;
|
||||||
}
|
}
|
||||||
return 15 * total / maxAmplitude;
|
return 15 * total / maxAmplitude;
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,12 +86,35 @@ void Viewer::CreateGeometry()
|
||||||
/*Generate positions and indices for a terrain patch with a
|
/*Generate positions and indices for a terrain patch with a
|
||||||
single triangle strip */
|
single triangle strip */
|
||||||
|
|
||||||
|
for (int i = 0; i < PATCH_SIZE; i++) {
|
||||||
|
for (int j = 0; j < PATCH_SIZE; j++) {
|
||||||
|
positions.emplace_back((float)i, (float)j, 0.0f, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// full x direction, we skip x = 255 inside the loop
|
||||||
|
// decrease y direction by 1
|
||||||
|
int count = (PATCH_SIZE) * (PATCH_SIZE-1);
|
||||||
|
|
||||||
|
for (int k = 0; k < count; k++) {
|
||||||
|
|
||||||
|
// skip creating triangles on last x in row
|
||||||
|
int end_of_x = k % (PATCH_SIZE-1);
|
||||||
|
|
||||||
|
if (end_of_x == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
indices.emplace_back(k);
|
||||||
|
indices.emplace_back(k + PATCH_SIZE);
|
||||||
|
indices.emplace_back(k + PATCH_SIZE + 1);
|
||||||
|
indices.emplace_back(k + 1);
|
||||||
|
}
|
||||||
|
|
||||||
terrainShader.bind();
|
terrainShader.bind();
|
||||||
terrainPositions.uploadData(positions).bindToAttribute("position");
|
terrainPositions.uploadData(positions).bindToAttribute("position");
|
||||||
terrainIndices.uploadData(indices.size() * sizeof(uint32_t), indices.data());
|
terrainIndices.uploadData(indices.size() * sizeof(uint32_t), indices.data());
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//textures
|
//textures
|
||||||
grassTexture = CreateTexture((unsigned char*)grass_jpg, grass_jpg_size);
|
grassTexture = CreateTexture((unsigned char*)grass_jpg, grass_jpg_size);
|
||||||
rockTexture = CreateTexture((unsigned char*)rock_jpg, rock_jpg_size);
|
rockTexture = CreateTexture((unsigned char*)rock_jpg, rock_jpg_size);
|
||||||
|
@ -176,7 +199,8 @@ void Viewer::drawContents()
|
||||||
terrainShader.setUniform("cameraPos", cameraPosition, false);
|
terrainShader.setUniform("cameraPos", cameraPosition, false);
|
||||||
|
|
||||||
/* Task: Render the terrain */
|
/* Task: Render the terrain */
|
||||||
|
glPrimitiveRestartIndex(256);
|
||||||
|
glDrawElements(GL_TRIANGLE_STRIP, (PATCH_SIZE-1) * (PATCH_SIZE-1), GL_UNSIGNED_INT, 0);
|
||||||
|
|
||||||
//Render text
|
//Render text
|
||||||
nvgBeginFrame(mNVGContext, width(), height(), mPixelRatio);
|
nvgBeginFrame(mNVGContext, width(), height(), mPixelRatio);
|
||||||
|
|
Loading…
Reference in a new issue