Colored dataset started working : no indexes yet, neither working with standard light

This commit is contained in:
Hurlu 2019-03-18 10:17:32 +09:00
parent 638571af42
commit babd5c06fd
15 changed files with 139 additions and 58 deletions

View File

@ -6,10 +6,9 @@ public:
Dataset() {}
~Dataset() {}
unsigned int nFaces;
unsigned int nVertices;
std::vector<glm::vec3> vertices;
std::vector<glm::vec3> normals;
std::vector<glm::vec3> colors;
void clear()
{
@ -32,14 +31,64 @@ public:
{ -1.0, 1.0, 1.0}, { 1.0, 1.0, 1.0}, { 1.0, 1.0, -1.0},
{ 1.0, 1.0, -1.0}, { -1.0, 1.0, -1.0}, { -1.0, 1.0, 1.0} };
colors = {
{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0},
{0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 0.0, 0.0},
{0.0, 1.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 0.0, 1.0},
{0.0, 0.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0},
{1.0, 1.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 1.0, 0.0},
{0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 1.0, 1.0},
{1.0, 0.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 1.0, 1.0},
{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 0.0, 0.0},
{1.0, 0.0, 0.0}, {0.0, 1.0, 0.0}, {0.0, 1.0, 0.0},
{0.0, 1.0, 0.0}, {1.0, 0.0, 0.0}, {1.0, 0.0, 0.0},
{1.0, 1.0, 1.0}, {0.0, 0.0, 1.0}, {0.0, 0.0, 1.0},
{0.0, 0.0, 1.0}, {1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}
},
genNormals();
nVertices = vertices.size();
}
void simpleFloor()
{
vertices = {{-10.0, 0.0, -10.0}, {-10.0, 0.0, 10.0}, {10.0, 0.0, -10.0},
{10.0, 0.0, 10.0}, {10.0, 0.0, -10.0}, {-10.0, 0.0, 10.0}};
colors = { {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7},
{0.7, 0.7, 0.7}, {0.7, 0.7, 0.7}, {0.7, 0.7, 0.7} };
genNormals();
}
void checkeredFloor(float size, int squares,
glm::vec3 light_color, glm::vec3 dark_color)
{
float maxX = size / 2.f, maxY = size / 2.f;
float minX = -size / 2.f, minY = -size / 2.f;
float side_size = size / (float)squares;
int color = 1;
for (float x = minX; x < maxX; x += side_size)
{
for (float y = minY; y < maxY; y += side_size)
{
color *= -1;
glm::vec3 tile_color = (color > 0) ? light_color : dark_color;
//gen 1 carré
vertices.emplace_back(x, 0, y); //upleft
vertices.emplace_back(x, 0, y + side_size); //downleft
vertices.emplace_back(x + side_size, 0, y + side_size); //downright
vertices.emplace_back(x + side_size, 0, y + side_size); //downright
vertices.emplace_back(x + side_size, 0, y); //upright
vertices.emplace_back(x, 0, y); //upleft
for (int z = 0; z < 6; z++)
colors.push_back(tile_color);
}
color *= -1;
}
genNormals();
}
private:
void genNormals()

View File

@ -1,4 +1,4 @@

#define GLM_ENABLE_EXPERIMENTAL
#include <vector>
@ -20,6 +20,7 @@
Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
{
renderType = NO_INDEX;
parent = m;
vbo[VERTEX_BUFFER] = NULL;
@ -30,45 +31,45 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
float *vertices = new float[set.nVertices * 3];
for (unsigned int i = 0; i < set.nVertices; ++i) {
vertices[i * 3] = set.vertices[i].x;
vertices[i * 3 + 1] = set.vertices[i].y;
vertices[i * 3 + 2] = set.vertices[i].z;
}
//Copy Mesh vertices to VBO
glGenBuffers(1, &vbo[VERTEX_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, set.vertices.size() * 3 * sizeof(GLfloat), set.vertices.data(), GL_STATIC_DRAW);
glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glVertexAttribPointer(VERTEX_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL);
glEnableVertexAttribArray(VERTEX_BUFFER);
delete[] vertices;
float *normals = new float[set.nVertices * 3];
for (unsigned int i = 0; i < set.nVertices; ++i) {
normals[i * 3] = set.normals[i].x;
normals[i * 3 + 1] = set.normals[i].y;
normals[i * 3 + 2] = set.normals[i].z;
}
//Copy Normals to VBO
glGenBuffers(1, &vbo[NORMAL_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[NORMAL_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), normals, GL_STATIC_DRAW);
glBufferData(GL_ARRAY_BUFFER, set.normals.size() * 3 * sizeof(GLfloat), set.normals.data(), GL_STATIC_DRAW);
glVertexAttribPointer(NORMAL_BUFFER, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glVertexAttribPointer(NORMAL_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL);
glEnableVertexAttribArray(NORMAL_BUFFER);
delete[] normals;
//Copy vertice color to VBO
glGenBuffers(1, &vbo[TEXCOORD_BUFFER]);
glBindBuffer(GL_ARRAY_BUFFER, vbo[TEXCOORD_BUFFER]);
glBufferData(GL_ARRAY_BUFFER, set.colors.size() * 3 * sizeof(GLfloat), set.colors.data(), GL_STATIC_DRAW);
glVertexAttribPointer(TEXCOORD_BUFFER, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, NULL);
glEnableVertexAttribArray(TEXCOORD_BUFFER);
dset_size = set.vertices.size();
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindVertexArray(0);
shininessStrength = 0;
}
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
{
renderType = OBJ;
parent = m;
vbo[VERTEX_BUFFER] = NULL;
@ -197,9 +198,16 @@ Mesh::MeshEntry::~MeshEntry() {
void Mesh::MeshEntry::render() {
glBindVertexArray(vao);
int size;
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glDrawElements(GL_TRIANGLES, size/ sizeof(unsigned int), GL_UNSIGNED_INT, NULL);
if (renderType == NO_INDEX)
{
glDrawArrays(GL_TRIANGLES, 0, dset_size);
}
else
{
int size;
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
glDrawElements(GL_TRIANGLES, size / sizeof(unsigned int), GL_UNSIGNED_INT, NULL);
}
glBindVertexArray(0);
}
@ -250,12 +258,16 @@ Mesh::~Mesh(void)
void Mesh::enableCulling()
{
if (cullMode == NONE)
return;
glEnable(GL_CULL_FACE);
glCullFace(cullMode);
}
void Mesh::disableCulling()
{
if (cullMode == NONE)
return;
glDisable(GL_CULL_FACE);
}

View File

@ -28,20 +28,31 @@ enum CullFace
FRONT_BACK = GL_FRONT_AND_BACK
};
enum RenderType
{
OBJ,
NO_INDEX
};
class Mesh
{
public:
struct MeshEntry {
enum BUFFERS {
VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER
VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER, SHADERSTORAGE_BUFFER
};
GLuint vao;
GLuint vbo[4];
unsigned int elementCount;
RenderType renderType;
unsigned int dset_size = 0;
GLuint ssbo;
glm::vec3 ssbo_data[3];
aiColor3D dcolor;
aiColor3D acolor;
aiColor3D scolor;
float shininessStrength;
MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m);
MeshEntry(Dataset &set, Mesh *m);

View File

@ -63,29 +63,37 @@ void MyGlWindow::setup()
_scnctx.lights.emplace("Light4", Light(glm::vec3(0.0f, 0.5f, 0.0f), glm::vec4(-8.09, 10, -5.87, 1)));
_scnctx.lights.emplace("Light5", Light(glm::vec3(0.5f, 0.5f, 0.5f), glm::vec4(3.09, 10, -9.51, 1)));
shaders["StandardLight"] = new Shader("light.vert", "light.frag");
shaders["FogShader"] = new Shader("fog.vert", "fog.frag");
shaders["Simple"] = new Shader("simple.vert", "simple.frag");
shaders["Simple"]->uniformFlags = ShaderFlags::MVP_FLAG;
shaders["Light"] = new Shader("light.vert", "light.frag");
shaders["Fog"] = new Shader("fog.vert", "fog.frag");
shaders["SilhouetteShader"] = new Shader("silhouette.vert", "silhouette.frag");
shaders["SilhouetteShader"]->uniformFlags = ShaderFlags::MVP_FLAG;
shaders["SilhouetteShader"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
shaders["SilhouetteShader"]->addUniform("sil_offset", 0.1f);
shaders["Silhouette"] = new Shader("silhouette.vert", "silhouette.frag");
shaders["Silhouette"]->uniformFlags = ShaderFlags::MVP_FLAG;
shaders["Silhouette"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
shaders["Silhouette"]->addUniform("sil_offset", 0.1f);
shaders["ToonShader"] = new Shader("light.vert", "toon.frag");
shaders["Toon"] = new Shader("light.vert", "toon.frag");
//Removing useless specular component
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
Dataset cube;
cube.simpleCube();
meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"]));
Dataset floor;
floor.checkeredFloor(20, 40, glm::vec3(0.1, 0.1, 0.1), glm::vec3(0.7, 0.7, 0.7));
/*meshes.push_back(new Mesh("teapot.obj", shaders["Silhouette"]));
meshes.back()->cullMode = FRONT;
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
meshes.push_back(new Mesh("teapot.obj", shaders["ToonShader"]));
meshes.push_back(new Mesh("teapot.obj", shaders["Toon"]));
meshes.back()->cullMode = BACK;
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
meshes.push_back(new Mesh(cube, shaders["StandardLight"]));
meshes.push_back(new Mesh(cube, shaders["Simple"]));
meshes.back()->addTranslation(glm::vec4(0, 1.01, 0, 1));*/
meshes.push_back(new Mesh(floor, shaders["Simple"]));
meshes.back()->cullMode = BACK;
}
void MyGlWindow::draw()

View File

@ -102,7 +102,7 @@ bool initGLFW()
}
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 4);
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
return true;
}

View File

@ -1,4 +1,4 @@
#version 430
#version 440
in vec3 f_color;
out vec4 FragColors;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
layout(location=0) in vec3 coord3d;
layout(location=1) in vec3 v_normal;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
in vec3 f_color;
out vec4 FragColors;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
layout(location=0) in vec3 coord3d;
layout(location=1) in vec3 v_normal;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
in vec3 f_color;
out vec4 FragColors;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
uniform vec3 fColor;
out vec4 FragColors;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
layout(location=0) in vec3 coord3d;
layout(location=1) in vec3 v_normal;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
in vec3 f_color;
out vec4 FragColors;

View File

@ -1,7 +1,8 @@
#version 430
#version 440
layout(location=0) in vec3 coord3d;
layout(location=1) in vec3 v_color;
layout(location=1) in vec3 v_normal;
layout(location=2) in vec3 v_color;
out vec3 f_color;

View File

@ -1,4 +1,4 @@
#version 430
#version 440
in vec3 f_color;
out vec4 FragColors;