Colored dataset started working : no indexes yet, neither working with standard light
This commit is contained in:
parent
638571af42
commit
babd5c06fd
@ -6,10 +6,9 @@ public:
|
|||||||
Dataset() {}
|
Dataset() {}
|
||||||
~Dataset() {}
|
~Dataset() {}
|
||||||
|
|
||||||
unsigned int nFaces;
|
|
||||||
unsigned int nVertices;
|
|
||||||
std::vector<glm::vec3> vertices;
|
std::vector<glm::vec3> vertices;
|
||||||
std::vector<glm::vec3> normals;
|
std::vector<glm::vec3> normals;
|
||||||
|
std::vector<glm::vec3> colors;
|
||||||
|
|
||||||
void clear()
|
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},
|
||||||
{ 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();
|
genNormals();
|
||||||
nVertices = vertices.size();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void simpleFloor()
|
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:
|
private:
|
||||||
|
|
||||||
void genNormals()
|
void genNormals()
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
#define GLM_ENABLE_EXPERIMENTAL
|
#define GLM_ENABLE_EXPERIMENTAL
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
|
Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
|
||||||
{
|
{
|
||||||
|
renderType = NO_INDEX;
|
||||||
parent = m;
|
parent = m;
|
||||||
|
|
||||||
vbo[VERTEX_BUFFER] = NULL;
|
vbo[VERTEX_BUFFER] = NULL;
|
||||||
@ -30,45 +31,45 @@ Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
|
|||||||
glGenVertexArrays(1, &vao);
|
glGenVertexArrays(1, &vao);
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
|
//Copy Mesh vertices to VBO
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
glGenBuffers(1, &vbo[VERTEX_BUFFER]);
|
glGenBuffers(1, &vbo[VERTEX_BUFFER]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 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);
|
glEnableVertexAttribArray(VERTEX_BUFFER);
|
||||||
|
|
||||||
delete[] vertices;
|
//Copy Normals to VBO
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
glGenBuffers(1, &vbo[NORMAL_BUFFER]);
|
glGenBuffers(1, &vbo[NORMAL_BUFFER]);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 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);
|
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);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
|
shininessStrength = 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
|
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
|
||||||
{
|
{
|
||||||
|
renderType = OBJ;
|
||||||
parent = m;
|
parent = m;
|
||||||
|
|
||||||
vbo[VERTEX_BUFFER] = NULL;
|
vbo[VERTEX_BUFFER] = NULL;
|
||||||
@ -197,9 +198,16 @@ Mesh::MeshEntry::~MeshEntry() {
|
|||||||
void Mesh::MeshEntry::render() {
|
void Mesh::MeshEntry::render() {
|
||||||
|
|
||||||
glBindVertexArray(vao);
|
glBindVertexArray(vao);
|
||||||
|
if (renderType == NO_INDEX)
|
||||||
|
{
|
||||||
|
glDrawArrays(GL_TRIANGLES, 0, dset_size);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
int size;
|
int size;
|
||||||
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
|
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER, GL_BUFFER_SIZE, &size);
|
||||||
glDrawElements(GL_TRIANGLES, size / sizeof(unsigned int), GL_UNSIGNED_INT, NULL);
|
glDrawElements(GL_TRIANGLES, size / sizeof(unsigned int), GL_UNSIGNED_INT, NULL);
|
||||||
|
}
|
||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -250,12 +258,16 @@ Mesh::~Mesh(void)
|
|||||||
|
|
||||||
void Mesh::enableCulling()
|
void Mesh::enableCulling()
|
||||||
{
|
{
|
||||||
|
if (cullMode == NONE)
|
||||||
|
return;
|
||||||
glEnable(GL_CULL_FACE);
|
glEnable(GL_CULL_FACE);
|
||||||
glCullFace(cullMode);
|
glCullFace(cullMode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::disableCulling()
|
void Mesh::disableCulling()
|
||||||
{
|
{
|
||||||
|
if (cullMode == NONE)
|
||||||
|
return;
|
||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -28,20 +28,31 @@ enum CullFace
|
|||||||
FRONT_BACK = GL_FRONT_AND_BACK
|
FRONT_BACK = GL_FRONT_AND_BACK
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum RenderType
|
||||||
|
{
|
||||||
|
OBJ,
|
||||||
|
NO_INDEX
|
||||||
|
};
|
||||||
|
|
||||||
class Mesh
|
class Mesh
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
struct MeshEntry {
|
struct MeshEntry {
|
||||||
enum BUFFERS {
|
enum BUFFERS {
|
||||||
VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER
|
VERTEX_BUFFER, NORMAL_BUFFER, TEXCOORD_BUFFER, INDEX_BUFFER, SHADERSTORAGE_BUFFER
|
||||||
};
|
};
|
||||||
GLuint vao;
|
GLuint vao;
|
||||||
GLuint vbo[4];
|
GLuint vbo[4];
|
||||||
|
|
||||||
unsigned int elementCount;
|
unsigned int elementCount;
|
||||||
|
RenderType renderType;
|
||||||
|
unsigned int dset_size = 0;
|
||||||
|
GLuint ssbo;
|
||||||
|
glm::vec3 ssbo_data[3];
|
||||||
aiColor3D dcolor;
|
aiColor3D dcolor;
|
||||||
aiColor3D acolor;
|
aiColor3D acolor;
|
||||||
aiColor3D scolor;
|
aiColor3D scolor;
|
||||||
|
|
||||||
float shininessStrength;
|
float shininessStrength;
|
||||||
MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m);
|
MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m);
|
||||||
MeshEntry(Dataset &set, Mesh *m);
|
MeshEntry(Dataset &set, Mesh *m);
|
||||||
|
|||||||
@ -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("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)));
|
_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["Simple"] = new Shader("simple.vert", "simple.frag");
|
||||||
shaders["FogShader"] = new Shader("fog.vert", "fog.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["Silhouette"] = new Shader("silhouette.vert", "silhouette.frag");
|
||||||
shaders["SilhouetteShader"]->uniformFlags = ShaderFlags::MVP_FLAG;
|
shaders["Silhouette"]->uniformFlags = ShaderFlags::MVP_FLAG;
|
||||||
shaders["SilhouetteShader"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
|
shaders["Silhouette"]->addUniform("fColor", glm::vec3(237/255, 229/255, 194/255));
|
||||||
shaders["SilhouetteShader"]->addUniform("sil_offset", 0.1f);
|
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
|
//Removing useless specular component
|
||||||
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
|
shaders["Toon"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
|
||||||
shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
|
shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
|
||||||
|
|
||||||
Dataset cube;
|
Dataset cube;
|
||||||
cube.simpleCube();
|
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()->cullMode = FRONT;
|
||||||
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
|
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()->cullMode = BACK;
|
||||||
meshes.back()->addTranslation(glm::vec4(-2, 0, -5, 0));
|
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()
|
void MyGlWindow::draw()
|
||||||
|
|||||||
@ -102,7 +102,7 @@ bool initGLFW()
|
|||||||
}
|
}
|
||||||
|
|
||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4);
|
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);
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
in vec3 f_color;
|
in vec3 f_color;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
layout(location=0) in vec3 coord3d;
|
layout(location=0) in vec3 coord3d;
|
||||||
layout(location=1) in vec3 v_normal;
|
layout(location=1) in vec3 v_normal;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
in vec3 f_color;
|
in vec3 f_color;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
layout(location=0) in vec3 coord3d;
|
layout(location=0) in vec3 coord3d;
|
||||||
layout(location=1) in vec3 v_normal;
|
layout(location=1) in vec3 v_normal;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
in vec3 f_color;
|
in vec3 f_color;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
uniform vec3 fColor;
|
uniform vec3 fColor;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
layout(location=0) in vec3 coord3d;
|
layout(location=0) in vec3 coord3d;
|
||||||
layout(location=1) in vec3 v_normal;
|
layout(location=1) in vec3 v_normal;
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
in vec3 f_color;
|
in vec3 f_color;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
layout(location=0) in vec3 coord3d;
|
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;
|
out vec3 f_color;
|
||||||
|
|
||||||
|
|||||||
@ -1,4 +1,4 @@
|
|||||||
#version 430
|
#version 440
|
||||||
|
|
||||||
in vec3 f_color;
|
in vec3 f_color;
|
||||||
out vec4 FragColors;
|
out vec4 FragColors;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user