Much more

This commit is contained in:
hodasemi 2018-11-26 17:58:30 +01:00
parent 562aeccc89
commit 8b4276f6ab
5 changed files with 140 additions and 33 deletions

View file

@ -1,5 +1,5 @@
// 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
#pragma once #pragma once
@ -8,38 +8,38 @@
class Viewer : public nse::gui::AbstractViewer class Viewer : public nse::gui::AbstractViewer
{ {
public: public:
Viewer(); Viewer();
void drawContents(); void drawContents();
private: private:
void SetupGUI(); void SetupGUI();
Eigen::Matrix4f modelViewMatrix, projectionMatrix; Eigen::Matrix4f modelViewMatrix, projectionMatrix;
//GUI Elements for the various options //GUI Elements for the various options
nanogui::CheckBox* chkHasFaceCulling; //Shall back face culling be activated? nanogui::CheckBox *chkHasFaceCulling; //Shall back face culling be activated?
nanogui::CheckBox* chkHasDepthTesting; //Shall depth testing be activated? nanogui::CheckBox *chkHasDepthTesting; //Shall depth testing be activated?
nanogui::Slider* sldJuliaCX; //Seed for the Julia fractal nanogui::Slider *sldJuliaCX; //Seed for the Julia fractal
nanogui::Slider* sldJuliaCY; nanogui::Slider *sldJuliaCY;
nanogui::Slider* sldJuliaZoom; //Zoom factor for the Julia fractal nanogui::Slider *sldJuliaZoom; //Zoom factor for the Julia fractal
nanogui::Slider* point1X; nanogui::Slider *point1X;
nanogui::Slider* point1Y; nanogui::Slider *point1Y;
nanogui::Slider* point2X; nanogui::Slider *point2X;
nanogui::Slider* point2Y; nanogui::Slider *point2Y;
nanogui::Slider* point3X; nanogui::Slider *point3X;
nanogui::Slider* point3Y; nanogui::Slider *point3Y;
// The following variables hold OpenGL object IDs // The following variables hold OpenGL object IDs
GLuint vertex_shader_id, // ID of the vertex shader GLuint vertex_shader_id, // ID of the vertex shader
fragment_shader_id, // ID of the fragment shader fragment_shader_id, // ID of the fragment shader
program_id, // ID of the shader program program_id, // ID of the shader program
vertex_array_id, // ID of the vertex array vertex_array_id, // ID of the vertex array
position_buffer_id, // ID of the position buffer position_buffer_id, // ID of the position buffer
color_buffer_id, // ID of the color buffer color_buffer_id, // ID of the color buffer
uv_map_buffer_id; // ID of the uv_map uv_map_buffer_id; // ID of the uv_map
GLint view_uniform_id; GLint view_uniform_id;
@ -49,7 +49,7 @@ private:
GLint julia_pos_id; GLint julia_pos_id;
// Read, Compile and link the shader codes to a shader program // Read, Compile and link the shader codes to a shader program
void CreateShaders(); void CreateShaders();
// Create and define the vertex array and add a number of vertex buffers // Create and define the vertex array and add a number of vertex buffers
void CreateVertexBuffers(); void CreateVertexBuffers();

View file

@ -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);

View file

@ -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;
} }

View file

@ -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;

View file

@ -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);
terrainVAO.bind();
if (REFERENCE)
{
referenceVAO.bind();
}
else
{
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);