Some optimizations

This commit is contained in:
Matthias Schiffer 2009-12-24 12:14:51 +01:00
parent 0f6fb2617e
commit 577cd77e2b
7 changed files with 60 additions and 45 deletions

3
shader/null.frag Normal file
View file

@ -0,0 +1,3 @@
void main() {
gl_FragColor = vec4(0, 0, 0, 1);
}

3
shader/null.vert Normal file
View file

@ -0,0 +1,3 @@
void main() {
gl_Position = ftransform();
}

View file

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

View file

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

View file

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

View file

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

View file

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