Some optimizations
This commit is contained in:
parent
0f6fb2617e
commit
577cd77e2b
7 changed files with 60 additions and 45 deletions
3
shader/null.frag
Normal file
3
shader/null.frag
Normal file
|
@ -0,0 +1,3 @@
|
|||
void main() {
|
||||
gl_FragColor = vec4(0, 0, 0, 1);
|
||||
}
|
3
shader/null.vert
Normal file
3
shader/null.vert
Normal file
|
@ -0,0 +1,3 @@
|
|||
void main() {
|
||||
gl_Position = ftransform();
|
||||
}
|
22
src/Game.cpp
22
src/Game.cpp
|
@ -94,7 +94,7 @@ void Game::turn(float x, float y) {
|
|||
|
||||
void Game::run(int delta) {
|
||||
lightPos += delta*0.5;
|
||||
lightPos = std::fmod(lightPos, 24000);
|
||||
lightPos = std::fmod(lightPos, 26000);
|
||||
|
||||
vmml::vec3f playerMove(vmml::vec3f::ZERO);
|
||||
|
||||
|
@ -119,20 +119,24 @@ void Game::render() {
|
|||
int i;
|
||||
vmml::vec3f light(vmml::vec3f::ZERO);
|
||||
|
||||
if(lightPos < 12000) i = lightPos;
|
||||
else i = 24000 - lightPos;
|
||||
if(lightPos < 13000) i = lightPos;
|
||||
else i = 26000 - lightPos;
|
||||
|
||||
if(i < 4000) {
|
||||
if(i < 500) {
|
||||
light.x() = 0.0;
|
||||
light.z() = -i * 0.001;
|
||||
light.z() = 0.0;
|
||||
}
|
||||
else if(i < 8000) {
|
||||
light.x() = (i-4000) * 0.001;
|
||||
else if(i < 4500) {
|
||||
light.x() = 0.0;
|
||||
light.z() = -(i-500) * 0.001;
|
||||
}
|
||||
else if(i < 8500) {
|
||||
light.x() = (i-4500) * 0.001;
|
||||
light.z() = -4.0;
|
||||
}
|
||||
else if(i < 12000) {
|
||||
else if(i < 12500) {
|
||||
light.x() = 4.0;
|
||||
light.z() = -4.0 - (i-8000) * 0.001;
|
||||
light.z() = -4.0 - (i-8500) * 0.001;
|
||||
}
|
||||
else {
|
||||
light.x() = 4.0;
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
namespace Zoom {
|
||||
|
||||
Renderer::Renderer() : activeTexture(0), renderVisitor(this) {
|
||||
nullShader = boost::shared_ptr<Shader>(Shader::load("null.vert", "null.frag"));
|
||||
ambientShader = boost::shared_ptr<Shader>(Shader::load("ambient.vert", "ambient.frag"));
|
||||
lightShader = boost::shared_ptr<Shader>(Shader::load("light.vert", "light.frag"));
|
||||
}
|
||||
|
@ -57,6 +58,33 @@ void Renderer::renderTriangle(const Triangle &t) {
|
|||
}
|
||||
}
|
||||
|
||||
void Renderer::renderShadowVolume(const ShadowVolume &v) {
|
||||
if(!v.isVisible())
|
||||
return;
|
||||
|
||||
glVertex3fv(v.getVertex(2).array);
|
||||
glVertex3fv(v.getVertex(1).array);
|
||||
glVertex3fv(v.getVertex(0).array);
|
||||
|
||||
for(int i = 0; i < 3; ++i) {
|
||||
const vmml::vec3f &p1 = v.getVertex(i), &p2 = v.getVertex((i+1)%3);
|
||||
const vmml::vec4f &dir1 = vmml::vec4f(v.getDirection(i), 0);
|
||||
const vmml::vec4f &dir2 = vmml::vec4f(v.getDirection((i+1)%3), 0);
|
||||
|
||||
glVertex3fv(p1.array);
|
||||
glVertex3fv(p2.array);
|
||||
glVertex4fv(dir1.array);
|
||||
|
||||
glVertex4fv(dir1.array);
|
||||
glVertex3fv(p2.array);
|
||||
glVertex4fv(dir2.array);
|
||||
}
|
||||
|
||||
glVertex4fv(vmml::vec4f(v.getDirection(0), 0).array);
|
||||
glVertex4fv(vmml::vec4f(v.getDirection(1), 0).array);
|
||||
glVertex4fv(vmml::vec4f(v.getDirection(2), 0).array);
|
||||
}
|
||||
|
||||
void Renderer::useTexture(unsigned texture) {
|
||||
if(texture) {
|
||||
glBindTexture(GL_TEXTURE_2D, texture);
|
||||
|
|
|
@ -65,31 +65,31 @@ class Renderer {
|
|||
glEnd();
|
||||
|
||||
// Render shadow volumes
|
||||
Shader::enable(nullShader);
|
||||
glClear(GL_STENCIL_BUFFER_BIT);
|
||||
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
|
||||
glDepthMask(GL_FALSE);
|
||||
|
||||
glFrontFace(GL_CCW);
|
||||
glCullFace(GL_FRONT);
|
||||
glStencilOp(GL_KEEP, GL_INCR, GL_KEEP);
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
for(std::vector<ShadowVolume>::iterator v = shadowVolumes.begin(); v != shadowVolumes.end(); ++v) {
|
||||
v->render();
|
||||
renderShadowVolume(*v);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glFrontFace(GL_CW);
|
||||
glCullFace(GL_BACK);
|
||||
glStencilOp(GL_KEEP, GL_DECR, GL_KEEP);
|
||||
|
||||
glBegin(GL_TRIANGLES);
|
||||
for(std::vector<ShadowVolume>::iterator v = shadowVolumes.begin(); v != shadowVolumes.end(); ++v) {
|
||||
v->render();
|
||||
renderShadowVolume(*v);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
glDepthMask(GL_TRUE);
|
||||
glFrontFace(GL_CCW);
|
||||
|
||||
// Render with point light
|
||||
Shader::enable(lightShader);
|
||||
|
@ -115,6 +115,7 @@ class Renderer {
|
|||
|
||||
private:
|
||||
void renderTriangle(const Triangle &t);
|
||||
static void renderShadowVolume(const ShadowVolume &v);
|
||||
void useTexture(unsigned texture);
|
||||
|
||||
class RenderVisitor {
|
||||
|
@ -129,7 +130,7 @@ class Renderer {
|
|||
Renderer *renderer;
|
||||
};
|
||||
|
||||
boost::shared_ptr<Shader> ambientShader, lightShader;
|
||||
boost::shared_ptr<Shader> nullShader, ambientShader, lightShader;
|
||||
unsigned activeTexture;
|
||||
|
||||
const RenderVisitor renderVisitor;
|
||||
|
|
|
@ -31,7 +31,7 @@ ShadowVolume::ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos) : vis
|
|||
rays[i].p = t.getVertex(i);
|
||||
}
|
||||
|
||||
if(trianglePlane.isInFront(lightPos)) {
|
||||
if(!trianglePlane.isBehind(lightPos)) {
|
||||
visible = false;
|
||||
|
||||
return;
|
||||
|
@ -42,30 +42,4 @@ ShadowVolume::ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos) : vis
|
|||
}
|
||||
}
|
||||
|
||||
void ShadowVolume::render() const {
|
||||
if(!visible)
|
||||
return;
|
||||
|
||||
glVertex3fv(rays[0].p.array);
|
||||
glVertex3fv(rays[1].p.array);
|
||||
glVertex3fv(rays[2].p.array);
|
||||
|
||||
for(int i = 0; i < 3; ++i) {
|
||||
const Ray &r1 = rays[i];
|
||||
const Ray &r2 = rays[(i+1)%3];
|
||||
|
||||
glVertex3fv(r1.p.array);
|
||||
glVertex4fv(vmml::vec4f(r1.dir, 0).array);
|
||||
glVertex3fv(r2.p.array);
|
||||
|
||||
glVertex3fv(r2.p.array);
|
||||
glVertex4fv(vmml::vec4f(r1.dir, 0).array);
|
||||
glVertex4fv(vmml::vec4f(r2.dir, 0).array);
|
||||
}
|
||||
|
||||
glVertex4fv(vmml::vec4f(rays[2].dir, 0).array);
|
||||
glVertex4fv(vmml::vec4f(rays[1].dir, 0).array);
|
||||
glVertex4fv(vmml::vec4f(rays[0].dir, 0).array);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -32,15 +32,17 @@ class ShadowVolume {
|
|||
ShadowVolume(const Triangle &t, const vmml::vec3f &lightPos);
|
||||
virtual ~ShadowVolume() {}
|
||||
|
||||
const vmml::vec3f& getVertex(int i) {
|
||||
const vmml::vec3f& getVertex(int i) const {
|
||||
return rays[i].p;
|
||||
}
|
||||
|
||||
const vmml::vec3f& getDirection(int i) {
|
||||
const vmml::vec3f& getDirection(int i) const {
|
||||
return rays[i].dir;
|
||||
}
|
||||
|
||||
void render() const;
|
||||
bool isVisible() const {
|
||||
return visible;
|
||||
}
|
||||
|
||||
private:
|
||||
bool visible;
|
||||
|
|
Reference in a new issue