STKMesh: Use VAO for faster rendering

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@15011 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
vincentlj
2014-01-12 17:03:02 +00:00
parent 1e84b57269
commit 8e7e84c984
3 changed files with 26 additions and 24 deletions

View File

@@ -6,6 +6,8 @@ noperspective in vec3 nor;
void main(void)
{
vec4 tex = texture2D(texture, uv);
if (tex.a < 0.5)
discard;
gl_FragData[0] = vec4(tex.xyz, 1.);
gl_FragData[1] = vec4(0.5 * normalize(nor) + 0.5, gl_FragCoord.z);
gl_FragData[2] = vec4(1. - tex.a);

View File

@@ -3,7 +3,7 @@
#include <ISceneManager.h>
#include <IMaterialRenderer.h>
namespace ObjectShader
namespace ObjectRefShader
{
GLuint Program;
GLuint attrib_position, attrib_texcoord, attrib_normal;
@@ -121,6 +121,17 @@ GLMesh allocateMeshBuffer(scene::IMeshBuffer* mb)
result.textures = static_cast<irr::video::COpenGLTexture*>(tex)->getOpenGLTextureName();
else
result.textures = 0;
glGenVertexArrays(1, &(result.vao));
glBindVertexArray(result.vao);
glBindBuffer(GL_ARRAY_BUFFER, result.vertex_buffer);
glEnableVertexAttribArray(ObjectRefShader::attrib_position);
glEnableVertexAttribArray(ObjectRefShader::attrib_texcoord);
glEnableVertexAttribArray(ObjectRefShader::attrib_normal);
glVertexAttribPointer(ObjectRefShader::attrib_position, 3, GL_FLOAT, GL_FALSE, result.Stride, 0);
glVertexAttribPointer(ObjectRefShader::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, result.Stride, (GLvoid*) 28);
glVertexAttribPointer(ObjectRefShader::attrib_normal, 3, GL_FLOAT, GL_FALSE, result.Stride, (GLvoid*) 12);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, result.index_buffer);
glBindVertexArray(0);
return result;
}
@@ -136,8 +147,8 @@ STKMesh::STKMesh(irr::scene::IMesh* mesh, ISceneNode* parent, irr::scene::IScene
GLmeshes.push_back(allocateMeshBuffer(mb));
}
if (!ObjectShader::Program)
ObjectShader::init();
if (!ObjectRefShader::Program)
ObjectRefShader::init();
}
STKMesh::~STKMesh()
@@ -155,15 +166,11 @@ void draw(const GLMesh &mesh)
glEnable(GL_ALPHA_TEST);
glDepthMask(GL_TRUE);
glDisable(GL_BLEND);
GLuint vbo = mesh.vertex_buffer, idx = mesh.index_buffer;
GLenum ptype = mesh.PrimitiveType;
GLenum itype = mesh.IndexType;
size_t count = mesh.IndexCount;
size_t stride = mesh.Stride;
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, idx);
glUseProgram(ObjectShader::Program);
glUseProgram(ObjectRefShader::Program);
core::matrix4 ModelViewProjectionMatrix = irr_driver->getVideoDriver()->getTransform(video::ETS_PROJECTION);
ModelViewProjectionMatrix *= irr_driver->getVideoDriver()->getTransform(video::ETS_VIEW);
ModelViewProjectionMatrix *= irr_driver->getVideoDriver()->getTransform(video::ETS_WORLD);
@@ -176,27 +183,19 @@ void draw(const GLMesh &mesh)
glBindTexture(GL_TEXTURE_2D, mesh.textures);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glUniform1f(ObjectShader::uniform_texture, 0);
glUniform1f(ObjectRefShader::uniform_texture, 0);
glUniformMatrix4fv(ObjectShader::uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer());
glUniformMatrix4fv(ObjectShader::uniform_TIMV, 1, GL_FALSE, TransposeInverseModelView.pointer());
glEnableVertexAttribArray(ObjectShader::attrib_position);
glEnableVertexAttribArray(ObjectShader::attrib_texcoord);
glEnableVertexAttribArray(ObjectShader::attrib_normal);
glVertexAttribPointer(ObjectShader::attrib_position, 3, GL_FLOAT, GL_FALSE, stride, 0);
glVertexAttribPointer(ObjectShader::attrib_texcoord, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*) 28);
glVertexAttribPointer(ObjectShader::attrib_normal, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*) 12);
glUniformMatrix4fv(ObjectRefShader::uniform_MVP, 1, GL_FALSE, ModelViewProjectionMatrix.pointer());
glUniformMatrix4fv(ObjectRefShader::uniform_TIMV, 1, GL_FALSE, TransposeInverseModelView.pointer());
glBindVertexArray(mesh.vao);
glDrawElements(ptype, count, itype, 0);
glDisableVertexAttribArray(ObjectShader::attrib_position);
glDisableVertexAttribArray(ObjectShader::attrib_texcoord);
glDisableVertexAttribArray(ObjectShader::attrib_normal);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
video::SMaterial material;
material.MaterialType = irr_driver->getShader(ES_RAIN);
// fakemat.setTexture(0, tex);
// fakemat.BlendOperation = video::EBO_NONE;
material.BlendOperation = video::EBO_NONE;
material.ZWriteEnable = true;
material.Lighting = false;
irr_driver->getVideoDriver()->setMaterial(material);
static_cast<irr::video::COpenGLDriver*>(irr_driver->getVideoDriver())->setRenderStates3DMode();
}

View File

@@ -9,6 +9,7 @@
#include <vector>
struct GLMesh {
GLuint vao;
GLuint vertex_buffer;
GLuint index_buffer;
GLuint textures;