Much more
This commit is contained in:
parent
562aeccc89
commit
8b4276f6ab
5 changed files with 140 additions and 33 deletions
|
@ -5,12 +5,17 @@
|
||||||
|
|
||||||
in vec3 n;
|
in vec3 n;
|
||||||
in vec2 uv;
|
in vec2 uv;
|
||||||
|
in vec2 road_uv;
|
||||||
|
|
||||||
out vec4 color;
|
out vec4 color;
|
||||||
|
|
||||||
uniform vec3 cameraPos;
|
uniform vec3 cameraPos;
|
||||||
|
|
||||||
uniform sampler2D grass;
|
uniform sampler2D grass;
|
||||||
|
uniform sampler2D rock;
|
||||||
|
uniform sampler2D alpha;
|
||||||
|
uniform sampler2D road;
|
||||||
|
uniform sampler2D specular_road;
|
||||||
|
|
||||||
uniform sampler2D background;
|
uniform sampler2D background;
|
||||||
uniform vec2 screenSize;
|
uniform vec2 screenSize;
|
||||||
|
@ -40,10 +45,10 @@ void main()
|
||||||
|
|
||||||
//material properties
|
//material properties
|
||||||
//color = vec4(0.6, 0.6, 0.6, 1);
|
//color = vec4(0.6, 0.6, 0.6, 1);
|
||||||
color = texture(grass, uv);
|
color = mix(texture(grass, uv), texture(rock, uv), dot(n, dirToViewer));
|
||||||
float specular = 0;
|
color = mix(color, texture(road, road_uv), texture(alpha, uv).x);
|
||||||
|
|
||||||
|
|
||||||
|
float specular = texture(specular_road, road_uv).x;
|
||||||
|
|
||||||
//Calculate light
|
//Calculate light
|
||||||
color = calculateLighting(color, specular, n, dirToViewer);
|
color = calculateLighting(color, specular, n, dirToViewer);
|
||||||
|
|
|
@ -7,6 +7,7 @@ in vec4 position;
|
||||||
|
|
||||||
out vec3 n;
|
out vec3 n;
|
||||||
out vec2 uv;
|
out vec2 uv;
|
||||||
|
out vec2 road_uv;
|
||||||
|
|
||||||
uniform mat4 mvp;
|
uniform mat4 mvp;
|
||||||
|
|
||||||
|
@ -32,6 +33,7 @@ void main()
|
||||||
//n = vec3(0.0, 1.0, 0.0);
|
//n = vec3(0.0, 1.0, 0.0);
|
||||||
|
|
||||||
uv = vec2(terrain_position.x / 255.0, terrain_position.z / 255.0);
|
uv = vec2(terrain_position.x / 255.0, terrain_position.z / 255.0);
|
||||||
|
road_uv = offsets[gl_VertexID % 6];
|
||||||
|
|
||||||
gl_Position = mvp * terrain_position;
|
gl_Position = mvp * terrain_position;
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,9 +33,16 @@ class Viewer : public nse::gui::AbstractViewer
|
||||||
nse::gui::GLBuffer terrainPositions;
|
nse::gui::GLBuffer terrainPositions;
|
||||||
nse::gui::GLBuffer terrainIndices;
|
nse::gui::GLBuffer terrainIndices;
|
||||||
|
|
||||||
|
nse::gui::GLVertexArray referenceVAO;
|
||||||
|
nse::gui::GLBuffer referenceVB, referenceIB;
|
||||||
|
|
||||||
GLuint grassTexture, rockTexture, roadColorTexture, roadNormalMap, roadSpecularMap, alphaMap;
|
GLuint grassTexture, rockTexture, roadColorTexture, roadNormalMap, roadSpecularMap, alphaMap;
|
||||||
|
|
||||||
GLint grass_texture_location;
|
GLint grass_texture_location;
|
||||||
|
GLint rock_texture_location;
|
||||||
|
GLint alpha_texture_location;
|
||||||
|
GLint road_texture_location;
|
||||||
|
GLint road_specular_location;
|
||||||
|
|
||||||
nse::gui::GLBuffer offsetBuffer;
|
nse::gui::GLBuffer offsetBuffer;
|
||||||
|
|
||||||
|
|
|
@ -18,18 +18,25 @@
|
||||||
#include "textures.h"
|
#include "textures.h"
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
#include <sstream>
|
||||||
|
|
||||||
const uint32_t PATCH_SIZE = 256; //number of vertices along one side of the terrain patch
|
constexpr bool REFERENCE = true;
|
||||||
|
constexpr uint32_t PATCH_SIZE = 256; //number of vertices along one side of the terrain patch
|
||||||
|
|
||||||
Viewer::Viewer()
|
Viewer::Viewer()
|
||||||
: AbstractViewer("CG1 Exercise 2"),
|
: AbstractViewer("CG1 Exercise 2"),
|
||||||
terrainPositions(nse::gui::VertexBuffer), terrainIndices(nse::gui::IndexBuffer),
|
terrainPositions(nse::gui::VertexBuffer), terrainIndices(nse::gui::IndexBuffer),
|
||||||
offsetBuffer(nse::gui::VertexBuffer)
|
offsetBuffer(nse::gui::VertexBuffer),
|
||||||
|
referenceVB(nse::gui::VertexBuffer), referenceIB(nse::gui::IndexBuffer)
|
||||||
{
|
{
|
||||||
LoadShaders();
|
LoadShaders();
|
||||||
CreateGeometry();
|
CreateGeometry();
|
||||||
|
|
||||||
grass_texture_location = terrainShader.uniform("grass");
|
grass_texture_location = terrainShader.uniform("grass");
|
||||||
|
rock_texture_location = terrainShader.uniform("rock");
|
||||||
|
alpha_texture_location = terrainShader.uniform("alpha");
|
||||||
|
road_texture_location = terrainShader.uniform("road");
|
||||||
|
road_specular_location = terrainShader.uniform("specular_road");
|
||||||
|
|
||||||
//Create a texture and framebuffer for the background
|
//Create a texture and framebuffer for the background
|
||||||
glGenFramebuffers(1, &backgroundFBO);
|
glGenFramebuffers(1, &backgroundFBO);
|
||||||
|
@ -138,6 +145,20 @@ GLuint CreateTexture(const unsigned char *fileData, size_t fileLength, bool repe
|
||||||
return textureName;
|
return textureName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::string vec4_to_str(Eigen::Vector4f &v)
|
||||||
|
{
|
||||||
|
std::stringstream ss;
|
||||||
|
|
||||||
|
ss << "(" << v.x() << ", "
|
||||||
|
<< v.y() << ", "
|
||||||
|
<< v.z() << ", "
|
||||||
|
<< v.w() << ")";
|
||||||
|
|
||||||
|
//std::cout << ss.str() << std::endl;
|
||||||
|
|
||||||
|
return ss.str();
|
||||||
|
}
|
||||||
|
|
||||||
void Viewer::CreateGeometry()
|
void Viewer::CreateGeometry()
|
||||||
{
|
{
|
||||||
//empty VAO for sky
|
//empty VAO for sky
|
||||||
|
@ -157,7 +178,7 @@ void Viewer::CreateGeometry()
|
||||||
{
|
{
|
||||||
for (int j = 0; j < PATCH_SIZE; j++)
|
for (int j = 0; j < PATCH_SIZE; j++)
|
||||||
{
|
{
|
||||||
positions.emplace_back((float)i, 0.0f, (float)j, 1.0f);
|
positions.emplace_back((float)j, 0.0f, (float)i, 1.0f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,12 +190,14 @@ void Viewer::CreateGeometry()
|
||||||
{
|
{
|
||||||
|
|
||||||
// skip creating triangles on last x in row
|
// skip creating triangles on last x in row
|
||||||
int end_of_x = k % (PATCH_SIZE - 1);
|
/*
|
||||||
|
int end_of_x = k % (PATCH_SIZE);
|
||||||
|
|
||||||
if (end_of_x == 0)
|
if (end_of_x == 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
indices.emplace_back(k);
|
indices.emplace_back(k);
|
||||||
indices.emplace_back(k + PATCH_SIZE);
|
indices.emplace_back(k + PATCH_SIZE);
|
||||||
|
@ -186,6 +209,45 @@ void Viewer::CreateGeometry()
|
||||||
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());
|
||||||
|
|
||||||
|
referenceVAO.generate();
|
||||||
|
referenceVAO.bind();
|
||||||
|
|
||||||
|
std::vector<Eigen::Vector4f> ref_pos;
|
||||||
|
std::vector<uint32_t> ref_ind;
|
||||||
|
|
||||||
|
for (int i = 0; i < PATCH_SIZE; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < PATCH_SIZE; j++)
|
||||||
|
{
|
||||||
|
ref_pos.emplace_back((float)j, 0.0f, (float)i, 1.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int index_width = PATCH_SIZE - 1;
|
||||||
|
|
||||||
|
for (int i = 0; i < index_width; i++)
|
||||||
|
{
|
||||||
|
for (int j = 0; j < index_width; j++)
|
||||||
|
{
|
||||||
|
int p1 = i + (PATCH_SIZE * j);
|
||||||
|
int p2 = i + (PATCH_SIZE * j) + 1;
|
||||||
|
int p3 = i + (PATCH_SIZE * (j + 1));
|
||||||
|
int p4 = i + (PATCH_SIZE * (j + 1)) + 1;
|
||||||
|
|
||||||
|
ref_ind.emplace_back(p1);
|
||||||
|
ref_ind.emplace_back(p3);
|
||||||
|
ref_ind.emplace_back(p2);
|
||||||
|
|
||||||
|
ref_ind.emplace_back(p3);
|
||||||
|
ref_ind.emplace_back(p2);
|
||||||
|
ref_ind.emplace_back(p4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
referenceVB.uploadData(ref_pos)
|
||||||
|
.bindToAttribute("position");
|
||||||
|
referenceIB.uploadData(ref_ind.size() * sizeof(uint32_t), ref_ind.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);
|
||||||
|
@ -261,7 +323,16 @@ void Viewer::drawContents()
|
||||||
|
|
||||||
//render terrain
|
//render terrain
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
|
if (REFERENCE)
|
||||||
|
{
|
||||||
|
referenceVAO.bind();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
terrainVAO.bind();
|
terrainVAO.bind();
|
||||||
|
}
|
||||||
|
|
||||||
terrainShader.bind();
|
terrainShader.bind();
|
||||||
|
|
||||||
terrainShader.setUniform("screenSize", Eigen::Vector2f(width(), height()), false);
|
terrainShader.setUniform("screenSize", Eigen::Vector2f(width(), height()), false);
|
||||||
|
@ -272,9 +343,31 @@ void Viewer::drawContents()
|
||||||
glBindTexture(GL_TEXTURE_2D, grassTexture);
|
glBindTexture(GL_TEXTURE_2D, grassTexture);
|
||||||
glUniform1i(grass_texture_location, 0);
|
glUniform1i(grass_texture_location, 0);
|
||||||
|
|
||||||
/* Task: Render the terrain */
|
glActiveTexture(GL_TEXTURE1);
|
||||||
glPrimitiveRestartIndex(512);
|
glBindTexture(GL_TEXTURE_2D, rockTexture);
|
||||||
glDrawElements(GL_TRIANGLE_STRIP, (PATCH_SIZE - 1) * (PATCH_SIZE - 1) * 4, GL_UNSIGNED_INT, 0);
|
glUniform1i(rock_texture_location, 1);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE2);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, alphaMap);
|
||||||
|
glUniform1i(alpha_texture_location, 2);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE3);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, roadColorTexture);
|
||||||
|
glUniform1i(road_texture_location, 3);
|
||||||
|
|
||||||
|
glActiveTexture(GL_TEXTURE4);
|
||||||
|
glBindTexture(GL_TEXTURE_2D, roadSpecularMap);
|
||||||
|
glUniform1i(road_specular_location, 4);
|
||||||
|
|
||||||
|
if (REFERENCE)
|
||||||
|
{
|
||||||
|
glDrawElements(GL_TRIANGLES, (PATCH_SIZE - 1) * (PATCH_SIZE - 1) * 6, GL_UNSIGNED_INT, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
glPrimitiveRestartIndex(PATCH_SIZE * 2);
|
||||||
|
glDrawElements(GL_TRIANGLE_STRIP, (PATCH_SIZE - 1) * PATCH_SIZE * 2, GL_UNSIGNED_INT, 0);
|
||||||
|
}
|
||||||
|
|
||||||
//Render text
|
//Render text
|
||||||
nvgBeginFrame(mNVGContext, width(), height(), mPixelRatio);
|
nvgBeginFrame(mNVGContext, width(), height(), mPixelRatio);
|
||||||
|
|
Loading…
Reference in a new issue