Fixed out uniforms not always working, advancing on dataset rendering
This commit is contained in:
parent
8f595cab38
commit
9b42d26f05
@ -184,6 +184,8 @@
|
|||||||
<ClInclude Include="Viewer.h" />
|
<ClInclude Include="Viewer.h" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<None Include="fog.frag" />
|
||||||
|
<None Include="fog.vert" />
|
||||||
<None Include="light.frag" />
|
<None Include="light.frag" />
|
||||||
<None Include="light.vert">
|
<None Include="light.vert">
|
||||||
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Geometry</ShaderType>
|
<ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Geometry</ShaderType>
|
||||||
@ -197,6 +199,8 @@
|
|||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
</None>
|
</None>
|
||||||
<None Include="onelight.frag" />
|
<None Include="onelight.frag" />
|
||||||
|
<None Include="silhouette.frag" />
|
||||||
|
<None Include="silhouette.vert" />
|
||||||
<None Include="simple.vert" />
|
<None Include="simple.vert" />
|
||||||
<None Include="toon.frag" />
|
<None Include="toon.frag" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|||||||
@ -148,5 +148,17 @@
|
|||||||
<None Include="toon.frag">
|
<None Include="toon.frag">
|
||||||
<Filter>Shaders</Filter>
|
<Filter>Shaders</Filter>
|
||||||
</None>
|
</None>
|
||||||
|
<None Include="silhouette.vert">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="silhouette.frag">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="fog.frag">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="fog.vert">
|
||||||
|
<Filter>Shaders</Filter>
|
||||||
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
@ -5,4 +5,9 @@ class Dataset
|
|||||||
public:
|
public:
|
||||||
Dataset();
|
Dataset();
|
||||||
~Dataset();
|
~Dataset();
|
||||||
|
|
||||||
|
unsigned int nFaces;
|
||||||
|
unsigned int nVertices;
|
||||||
|
std::vector<glm::vec3> vertices;
|
||||||
|
std::vector<glm::vec3> normals;
|
||||||
};
|
};
|
||||||
@ -18,6 +18,54 @@
|
|||||||
* Constructor, loading the specified aiMesh
|
* Constructor, loading the specified aiMesh
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
Mesh::MeshEntry::MeshEntry(Dataset &set, Mesh *m)
|
||||||
|
{
|
||||||
|
parent = m;
|
||||||
|
|
||||||
|
vbo[VERTEX_BUFFER] = NULL;
|
||||||
|
vbo[TEXCOORD_BUFFER] = NULL;
|
||||||
|
vbo[NORMAL_BUFFER] = NULL;
|
||||||
|
vbo[INDEX_BUFFER] = NULL;
|
||||||
|
|
||||||
|
glGenVertexArrays(1, &vao);
|
||||||
|
glBindVertexArray(vao);
|
||||||
|
|
||||||
|
elementCount = set.nFaces * 3;
|
||||||
|
|
||||||
|
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]);
|
||||||
|
glBindBuffer(GL_ARRAY_BUFFER, vbo[VERTEX_BUFFER]);
|
||||||
|
glBufferData(GL_ARRAY_BUFFER, 3 * set.nVertices * sizeof(GLfloat), vertices, GL_STATIC_DRAW);
|
||||||
|
|
||||||
|
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(0);
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
||||||
|
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, NULL);
|
||||||
|
glEnableVertexAttribArray(1);
|
||||||
|
|
||||||
|
delete[] normals;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
|
Mesh::MeshEntry::MeshEntry(aiMesh *mesh, const aiScene* scene, Mesh * m)
|
||||||
{
|
{
|
||||||
parent = m;
|
parent = m;
|
||||||
@ -186,6 +234,13 @@ Mesh::Mesh(const char *filename, Shader *sh)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Mesh::Mesh(Dataset &set, Shader *sh)
|
||||||
|
{
|
||||||
|
shader = sh;
|
||||||
|
|
||||||
|
meshEntries.push_back(new Mesh::MeshEntry(set, this));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Clears all loaded MeshEntries
|
* Clears all loaded MeshEntries
|
||||||
**/
|
**/
|
||||||
@ -198,9 +253,21 @@ Mesh::~Mesh(void)
|
|||||||
meshEntries.clear();
|
meshEntries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mesh::enableCulling()
|
||||||
|
{
|
||||||
|
glEnable(GL_CULL_FACE);
|
||||||
|
glCullFace(cullMode);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Mesh::disableCulling()
|
||||||
|
{
|
||||||
|
glDisable(GL_CULL_FACE);
|
||||||
|
}
|
||||||
|
|
||||||
void Mesh::draw(SceneContext ctx) {
|
void Mesh::draw(SceneContext ctx) {
|
||||||
|
|
||||||
shader->enable();
|
shader->enable();
|
||||||
|
enableCulling();
|
||||||
for (unsigned int i = 0; i < meshEntries.size(); ++i) {
|
for (unsigned int i = 0; i < meshEntries.size(); ++i) {
|
||||||
|
|
||||||
MeshEntry * m = meshEntries[i];
|
MeshEntry * m = meshEntries[i];
|
||||||
@ -249,6 +316,7 @@ void Mesh::draw(SceneContext ctx) {
|
|||||||
meshEntries.at(i)->render();
|
meshEntries.at(i)->render();
|
||||||
model.glPopMatrix();
|
model.glPopMatrix();
|
||||||
}
|
}
|
||||||
|
disableCulling();
|
||||||
shader->disable();
|
shader->disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -20,6 +20,14 @@ enum Transformation
|
|||||||
Scaling
|
Scaling
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum CullFace
|
||||||
|
{
|
||||||
|
NONE = GL_NONE,
|
||||||
|
FRONT = GL_FRONT,
|
||||||
|
BACK = GL_BACK,
|
||||||
|
FRONT_BACK = GL_FRONT_AND_BACK
|
||||||
|
};
|
||||||
|
|
||||||
class Mesh
|
class Mesh
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@ -36,6 +44,7 @@ public:
|
|||||||
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();
|
~MeshEntry();
|
||||||
Mesh * parent;
|
Mesh * parent;
|
||||||
void render();
|
void render();
|
||||||
@ -49,8 +58,12 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
std::vector<std::pair<glm::vec4, Transformation>> _transformations;
|
std::vector<std::pair<glm::vec4, Transformation>> _transformations;
|
||||||
|
|
||||||
|
void enableCulling();
|
||||||
|
void disableCulling();
|
||||||
public:
|
public:
|
||||||
Model model;
|
Model model;
|
||||||
|
CullFace cullMode = NONE;
|
||||||
void effectTransformations();
|
void effectTransformations();
|
||||||
void addRotation(glm::vec4 vec);
|
void addRotation(glm::vec4 vec);
|
||||||
void addTranslation(glm::vec4 vec);
|
void addTranslation(glm::vec4 vec);
|
||||||
|
|||||||
@ -63,20 +63,27 @@ 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["ToonShader"] = Shader("light.vert", "toon.frag");
|
shaders["StandardLight"] = new Shader("light.vert", "light.frag");
|
||||||
//// Removing useless specular component
|
//shaders["FogShader"] = new Shader("fog.vert", "fog.frag");
|
||||||
//shaders["ToonShader"].uniformFlags &= ~ShaderFlags::KS_FLAG;
|
|
||||||
//shaders["ToonShader"].uniformFlags &= ~ShaderFlags::SHINE_FLAG;
|
|
||||||
|
|
||||||
//meshes.emplace_back("teapot.obj", &shaders["ToonShader"]);
|
//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);
|
||||||
|
//
|
||||||
|
|
||||||
ToonShader = new Shader("light.vert", "toon.frag");
|
|
||||||
|
|
||||||
ToonShader->uniformFlags &= ~ShaderFlags::KS_FLAG;
|
//shaders["ToonShader"] = new Shader("light.vert", "toon.frag");
|
||||||
ToonShader->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
|
////Removing useless specular component
|
||||||
|
//shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::KS_FLAG;
|
||||||
meshes.emplace_back("teapot.obj", ToonShader);
|
//shaders["ToonShader"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG;
|
||||||
|
//
|
||||||
|
meshes.push_back(new Mesh("quad.obj", shaders["StandardLight"]));
|
||||||
|
|
||||||
|
/*meshes.push_back(new Mesh("teapot.obj", shaders["SilhouetteShader"]));
|
||||||
|
meshes.back()->cullMode = FRONT;
|
||||||
|
meshes.push_back(new Mesh("teapot.obj", shaders["ToonShader"]));
|
||||||
|
meshes.back()->cullMode = BACK;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyGlWindow::draw()
|
void MyGlWindow::draw()
|
||||||
@ -85,12 +92,7 @@ void MyGlWindow::draw()
|
|||||||
glViewport(0, 0, m_width, m_height);
|
glViewport(0, 0, m_width, m_height);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
glEnable(GL_DEPTH_BUFFER);
|
glEnable(GL_DEPTH_BUFFER);
|
||||||
glEnable(GL_BLEND);
|
|
||||||
//glEnable(GL_CULL_FACE);
|
|
||||||
//glCullFace(GL_BACK);
|
|
||||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
//setting the view data in the scene context
|
|
||||||
|
|
||||||
glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z);
|
glm::vec3 eye(viewer.getViewPoint().x, viewer.getViewPoint().y, viewer.getViewPoint().z);
|
||||||
glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z);
|
glm::vec3 look(viewer.getViewCenter().x, viewer.getViewCenter().y, viewer.getViewCenter().z);
|
||||||
@ -100,9 +102,8 @@ void MyGlWindow::draw()
|
|||||||
|
|
||||||
_scnctx.viewMatrix = view;
|
_scnctx.viewMatrix = view;
|
||||||
_scnctx.projectionMatrix = projection;
|
_scnctx.projectionMatrix = projection;
|
||||||
static int i = 0;
|
for (auto it = meshes.begin(); it != meshes.end(); it++)
|
||||||
for (auto it = meshes.begin(); it != meshes.end(); ++it)
|
(*it)->draw(_scnctx);
|
||||||
it->draw(_scnctx);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MyGlWindow::resize(int w, int h)
|
void MyGlWindow::resize(int w, int h)
|
||||||
|
|||||||
@ -24,14 +24,13 @@ public:
|
|||||||
void draw();
|
void draw();
|
||||||
void setBgColor(float bgColor[3]);
|
void setBgColor(float bgColor[3]);
|
||||||
|
|
||||||
std::map<std::string, Shader> shaders;
|
std::map<std::string, Shader *> shaders;
|
||||||
std::vector<Mesh> meshes;
|
std::vector<Mesh *> meshes;
|
||||||
|
|
||||||
void resize(int w, int h);
|
void resize(int w, int h);
|
||||||
Viewer viewer;
|
Viewer viewer;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Shader *ToonShader;
|
|
||||||
SceneContext _scnctx;
|
SceneContext _scnctx;
|
||||||
int m_width;
|
int m_width;
|
||||||
int m_height;
|
int m_height;
|
||||||
@ -41,7 +40,5 @@ private:
|
|||||||
GLuint _vaoHandle;
|
GLuint _vaoHandle;
|
||||||
GLuint _iboHandle;
|
GLuint _iboHandle;
|
||||||
|
|
||||||
std::vector<Mesh> _drawables;
|
|
||||||
|
|
||||||
void setup();
|
void setup();
|
||||||
};
|
};
|
||||||
|
|||||||
@ -3,6 +3,7 @@
|
|||||||
#include <vector>
|
#include <vector>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <GL/glew.h>
|
#include <GL/glew.h>
|
||||||
|
#include <functional>
|
||||||
#include "glm/gtc/type_ptr.hpp"
|
#include "glm/gtc/type_ptr.hpp"
|
||||||
|
|
||||||
#include "Material.h"
|
#include "Material.h"
|
||||||
@ -39,6 +40,14 @@ public:
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
void setUniforms(SceneContext ctx);
|
void setUniforms(SceneContext ctx);
|
||||||
|
void addUniform(const std::string name, glm::vec3 data)
|
||||||
|
{
|
||||||
|
_program.use(); glUniform3fv(_program.addUniform(name), 1, glm::value_ptr(data)); ; _program.disable();
|
||||||
|
}
|
||||||
|
void addUniform(const std::string name, float data)
|
||||||
|
{
|
||||||
|
_program.use(); glUniform1fv(_program.addUniform(name), 1, &data); _program.disable();
|
||||||
|
}
|
||||||
private:
|
private:
|
||||||
void setMaterial(SceneContext ctx);
|
void setMaterial(SceneContext ctx);
|
||||||
void setCamera(SceneContext ctx);
|
void setCamera(SceneContext ctx);
|
||||||
|
|||||||
53
BaseGLProject/fog.frag
Normal file
53
BaseGLProject/fog.frag
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
in vec3 f_color;
|
||||||
|
out vec4 FragColors;
|
||||||
|
|
||||||
|
uniform vec3 Kd;
|
||||||
|
uniform vec3 Ka;
|
||||||
|
uniform vec3 Ks;
|
||||||
|
uniform float Shininess;
|
||||||
|
|
||||||
|
uniform int LightCount;
|
||||||
|
|
||||||
|
struct LightInfo {
|
||||||
|
vec4 Position;
|
||||||
|
vec3 Intensity;
|
||||||
|
};
|
||||||
|
|
||||||
|
uniform LightInfo Light[64];
|
||||||
|
|
||||||
|
in vec3 fNormal;
|
||||||
|
in vec3 pos;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
|
||||||
|
vec3 finalColor;
|
||||||
|
vec3 ambient;
|
||||||
|
|
||||||
|
ambient = Ka * Light[0].Intensity;
|
||||||
|
for (int i=0; i< LightCount; i++)
|
||||||
|
{
|
||||||
|
vec3 L = normalize(Light[i].Position.xyz - pos);
|
||||||
|
vec3 N = fNormal;
|
||||||
|
vec3 V = normalize(-pos);
|
||||||
|
//vec3 R = normalize(reflect(-L, N));
|
||||||
|
vec3 H = normalize(V + L);
|
||||||
|
|
||||||
|
vec3 diffuse = Kd * Light[i].Intensity * max(dot(L, N), 0.0);
|
||||||
|
vec3 specular = Ks * Light[i].Intensity * pow(max(dot(H, N), 0.0), Shininess);
|
||||||
|
finalColor = finalColor + diffuse + specular;
|
||||||
|
}
|
||||||
|
|
||||||
|
finalColor = finalColor + ambient;
|
||||||
|
|
||||||
|
//fog calculus
|
||||||
|
float z = abs(pos.z);
|
||||||
|
float f = (30 - z) / (30 - 1);
|
||||||
|
vec3 fogColor = vec3(1, 1, 1);
|
||||||
|
f = clamp(f, 0.0, 1.0);
|
||||||
|
finalColor = mix(fogColor, finalColor, f);
|
||||||
|
|
||||||
|
FragColors = vec4(finalColor, 1);
|
||||||
|
}
|
||||||
21
BaseGLProject/fog.vert
Normal file
21
BaseGLProject/fog.vert
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
layout(location=0) in vec3 coord3d;
|
||||||
|
layout(location=1) in vec3 v_normal;
|
||||||
|
layout(location=2) in vec3 v_color;
|
||||||
|
|
||||||
|
uniform mat4 mvp;
|
||||||
|
uniform mat3 NormalMatrix;
|
||||||
|
uniform mat4 ModelViewMatrix;
|
||||||
|
|
||||||
|
out vec3 fNormal;
|
||||||
|
out vec3 pos;
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
fNormal = normalize(NormalMatrix * v_normal);
|
||||||
|
pos = (ModelViewMatrix * vec4(coord3d, 1.0)).xyz;
|
||||||
|
|
||||||
|
gl_Position = mvp * vec4(coord3d, 1.0f);
|
||||||
|
}
|
||||||
@ -13,7 +13,8 @@ struct LightInfo {
|
|||||||
vec3 Intensity;
|
vec3 Intensity;
|
||||||
};
|
};
|
||||||
|
|
||||||
uniform LightInfo Light[5];
|
uniform LightInfo Light[64];
|
||||||
|
uniform int LightCount;
|
||||||
|
|
||||||
|
|
||||||
in vec3 fNormal;
|
in vec3 fNormal;
|
||||||
@ -26,7 +27,7 @@ void main()
|
|||||||
vec3 ambient;
|
vec3 ambient;
|
||||||
|
|
||||||
ambient = Ka * Light[0].Intensity;
|
ambient = Ka * Light[0].Intensity;
|
||||||
for (int i=0; i<5; i++)
|
for (int i=0; i<LightCount; i++)
|
||||||
{
|
{
|
||||||
vec3 L = normalize(Light[i].Position.xyz - pos);
|
vec3 L = normalize(Light[i].Position.xyz - pos);
|
||||||
vec3 N = fNormal;
|
vec3 N = fNormal;
|
||||||
|
|||||||
@ -11,7 +11,6 @@ uniform mat4 ModelViewMatrix;
|
|||||||
out vec3 fNormal;
|
out vec3 fNormal;
|
||||||
out vec3 pos;
|
out vec3 pos;
|
||||||
|
|
||||||
|
|
||||||
void main(void)
|
void main(void)
|
||||||
{
|
{
|
||||||
fNormal = normalize(NormalMatrix * v_normal);
|
fNormal = normalize(NormalMatrix * v_normal);
|
||||||
|
|||||||
9
BaseGLProject/silhouette.frag
Normal file
9
BaseGLProject/silhouette.frag
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
uniform vec3 fColor;
|
||||||
|
out vec4 FragColors;
|
||||||
|
|
||||||
|
void main()
|
||||||
|
{
|
||||||
|
FragColors = vec4(fColor, 1.f);
|
||||||
|
}
|
||||||
13
BaseGLProject/silhouette.vert
Normal file
13
BaseGLProject/silhouette.vert
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#version 430
|
||||||
|
|
||||||
|
layout(location=0) in vec3 coord3d;
|
||||||
|
layout(location=1) in vec3 v_normal;
|
||||||
|
layout(location=2) in vec3 v_color;
|
||||||
|
|
||||||
|
uniform mat4 mvp;
|
||||||
|
uniform float sil_offset;
|
||||||
|
|
||||||
|
void main(void)
|
||||||
|
{
|
||||||
|
gl_Position = mvp * vec4(coord3d + v_normal * sil_offset, 1.0f);
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user