mirror of https://github.com/axmolengine/axmol.git
render optimization
This commit is contained in:
parent
db60512c4b
commit
accf6f91ea
|
@ -358,13 +358,14 @@ void GLProgramState::applyGLProgram(const Mat4& modelView)
|
||||||
_glprogram->use();
|
_glprogram->use();
|
||||||
_glprogram->setUniformsForBuiltins(modelView);
|
_glprogram->setUniformsForBuiltins(modelView);
|
||||||
}
|
}
|
||||||
void GLProgramState::applyAttributes()
|
void GLProgramState::applyAttributes(bool applyAttribFlags)
|
||||||
{
|
{
|
||||||
// Don't set attributes if they weren't set
|
// Don't set attributes if they weren't set
|
||||||
// Use Case: Auto-batching
|
// Use Case: Auto-batching
|
||||||
if(_vertexAttribsFlags) {
|
if(_vertexAttribsFlags) {
|
||||||
// enable/disable vertex attribs
|
// enable/disable vertex attribs
|
||||||
GL::enableVertexAttribs(_vertexAttribsFlags);
|
if (applyAttribFlags)
|
||||||
|
GL::enableVertexAttribs(_vertexAttribsFlags);
|
||||||
// set attributes
|
// set attributes
|
||||||
for(auto &attribute : _attributes)
|
for(auto &attribute : _attributes)
|
||||||
{
|
{
|
||||||
|
|
|
@ -161,7 +161,11 @@ public:
|
||||||
void apply(const Mat4& modelView);
|
void apply(const Mat4& modelView);
|
||||||
|
|
||||||
void applyGLProgram(const Mat4& modelView);
|
void applyGLProgram(const Mat4& modelView);
|
||||||
void applyAttributes();
|
/**
|
||||||
|
* apply vertex attributes
|
||||||
|
* @param applyAttribFlags Call GL::enableVertexAttribs(_vertexAttribsFlags) or not
|
||||||
|
*/
|
||||||
|
void applyAttributes(bool applyAttribFlags = true);
|
||||||
void applyUniforms();
|
void applyUniforms();
|
||||||
|
|
||||||
void setGLProgram(GLProgram* glprogram);
|
void setGLProgram(GLProgram* glprogram);
|
||||||
|
|
|
@ -85,7 +85,6 @@ void MeshCommand::init(float globalOrder,
|
||||||
_indexBuffer = indexBuffer;
|
_indexBuffer = indexBuffer;
|
||||||
_primitive = primitive;
|
_primitive = primitive;
|
||||||
_indexFormat = indexFormat;
|
_indexFormat = indexFormat;
|
||||||
//_vao = vao;
|
|
||||||
_indexCount = indexCount;
|
_indexCount = indexCount;
|
||||||
_mv = mv;
|
_mv = mv;
|
||||||
}
|
}
|
||||||
|
@ -169,8 +168,6 @@ void MeshCommand::genMaterialID(GLuint texID, void* glProgramState, void* mesh,
|
||||||
}
|
}
|
||||||
int intArray[] = {(int)texID, statekey[0], statekey[1], meshkey[0], meshkey[1], (int)blend.src, (int)blend.dst};
|
int intArray[] = {(int)texID, statekey[0], statekey[1], meshkey[0], meshkey[1], (int)blend.src, (int)blend.dst};
|
||||||
_materialID = XXH32((const void*)intArray, sizeof(intArray), 0);
|
_materialID = XXH32((const void*)intArray, sizeof(intArray), 0);
|
||||||
|
|
||||||
//generate vao here
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void MeshCommand::MatrixPalleteCallBack( GLProgram* glProgram, Uniform* uniform)
|
void MeshCommand::MatrixPalleteCallBack( GLProgram* glProgram, Uniform* uniform)
|
||||||
|
@ -185,12 +182,13 @@ void MeshCommand::preBatchDraw()
|
||||||
// Set material
|
// Set material
|
||||||
GL::bindTexture2D(_textureID);
|
GL::bindTexture2D(_textureID);
|
||||||
GL::blendFunc(_blendType.src, _blendType.dst);
|
GL::blendFunc(_blendType.src, _blendType.dst);
|
||||||
|
|
||||||
if (_vao == 0)
|
if (_vao == 0)
|
||||||
buildVAO();
|
buildVAO();
|
||||||
if (_vao)
|
if (_vao)
|
||||||
{
|
{
|
||||||
GL::bindVAO(_vao);
|
GL::bindVAO(_vao);
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -198,8 +196,6 @@ void MeshCommand::preBatchDraw()
|
||||||
_glProgramState->applyAttributes();
|
_glProgramState->applyAttributes();
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
//glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
|
||||||
}
|
}
|
||||||
void MeshCommand::batchDraw()
|
void MeshCommand::batchDraw()
|
||||||
{
|
{
|
||||||
|
@ -215,7 +211,6 @@ void MeshCommand::batchDraw()
|
||||||
|
|
||||||
_glProgramState->applyGLProgram(_mv);
|
_glProgramState->applyGLProgram(_mv);
|
||||||
_glProgramState->applyUniforms();
|
_glProgramState->applyUniforms();
|
||||||
//_glProgramState->apply(_mv);
|
|
||||||
|
|
||||||
// Draw
|
// Draw
|
||||||
glDrawElements(_primitive, (GLsizei)_indexCount, _indexFormat, 0);
|
glDrawElements(_primitive, (GLsizei)_indexCount, _indexFormat, 0);
|
||||||
|
@ -274,10 +269,20 @@ void MeshCommand::buildVAO()
|
||||||
releaseVAO();
|
releaseVAO();
|
||||||
if (Configuration::getInstance()->supportsShareableVAO())
|
if (Configuration::getInstance()->supportsShareableVAO())
|
||||||
{
|
{
|
||||||
|
glGenVertexArrays(1, &_vao);
|
||||||
|
GL::bindVAO(_vao);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
glBindBuffer(GL_ARRAY_BUFFER, _vertexBuffer);
|
||||||
_glProgramState->applyAttributes();
|
auto flags = _glProgramState->getVertexAttribsFlags();
|
||||||
|
for (int i = 0; flags > 0; i++) {
|
||||||
|
int flag = 1 << i;
|
||||||
|
if (flag & flags)
|
||||||
|
glEnableVertexAttribArray(i);
|
||||||
|
flags &= ~flag;
|
||||||
|
}
|
||||||
|
_glProgramState->applyAttributes(false);
|
||||||
|
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, _indexBuffer);
|
||||||
|
|
||||||
GL::bindVAO(0);
|
GL::bindVAO(0);
|
||||||
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ARRAY_BUFFER, 0);
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
|
||||||
|
@ -288,6 +293,7 @@ void MeshCommand::releaseVAO()
|
||||||
if (Configuration::getInstance()->supportsShareableVAO() && _vao)
|
if (Configuration::getInstance()->supportsShareableVAO() && _vao)
|
||||||
{
|
{
|
||||||
glDeleteVertexArrays(1, &_vao);
|
glDeleteVertexArrays(1, &_vao);
|
||||||
|
_vao = 0;
|
||||||
GL::bindVAO(0);
|
GL::bindVAO(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -331,12 +331,13 @@ void Renderer::visitRenderQueue(const RenderQueue& queue)
|
||||||
flush3D();
|
flush3D();
|
||||||
cmd->preBatchDraw();
|
cmd->preBatchDraw();
|
||||||
cmd->batchDraw();
|
cmd->batchDraw();
|
||||||
|
_lastBatchedMeshCommand = cmd;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cmd->batchDraw();
|
cmd->batchDraw();
|
||||||
}
|
}
|
||||||
_lastBatchedMeshCommand = cmd;
|
|
||||||
// cmd->execute();
|
// cmd->execute();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -29,34 +29,47 @@ uniform vec4 u_matrixPalette[SKINNING_JOINT_COUNT * 3];
|
||||||
// Varyings
|
// Varyings
|
||||||
varying vec2 TextureCoordOut;
|
varying vec2 TextureCoordOut;
|
||||||
|
|
||||||
vec4 _skinnedPosition;
|
|
||||||
|
|
||||||
vec4 getPosition()
|
vec4 getPosition()
|
||||||
{
|
{
|
||||||
float blendWeight = a_blendWeight[0];
|
float blendWeight = a_blendWeight[0];
|
||||||
|
|
||||||
int matrixIndex = int (a_blendIndex[0]) * 3;
|
int matrixIndex = int (a_blendIndex[0]) * 3;
|
||||||
vec4 matrixPalette1 = u_matrixPalette[matrixIndex] * blendWeight;
|
vec4 matrixPalette1 = u_matrixPalette[matrixIndex] * blendWeight;
|
||||||
vec4 matrixPalette2 = u_matrixPalette[matrixIndex + 1] * blendWeight;
|
vec4 matrixPalette2 = u_matrixPalette[matrixIndex + 1] * blendWeight;
|
||||||
vec4 matrixPalette3 = u_matrixPalette[matrixIndex + 2] * blendWeight;
|
vec4 matrixPalette3 = u_matrixPalette[matrixIndex + 2] * blendWeight;
|
||||||
|
|
||||||
|
|
||||||
blendWeight = a_blendWeight[1];
|
blendWeight = a_blendWeight[1];
|
||||||
matrixIndex = int(a_blendIndex[1]) * 3;
|
if (blendWeight > 0.0)
|
||||||
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
{
|
||||||
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
matrixIndex = int(a_blendIndex[1]) * 3;
|
||||||
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
||||||
|
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
||||||
|
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
blendWeight = a_blendWeight[2];
|
blendWeight = a_blendWeight[2];
|
||||||
matrixIndex = int(a_blendIndex[2]) * 3;
|
if (blendWeight > 0.0)
|
||||||
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
{
|
||||||
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
matrixIndex = int(a_blendIndex[2]) * 3;
|
||||||
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
||||||
|
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
||||||
|
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
blendWeight = a_blendWeight[3];
|
blendWeight = a_blendWeight[3];
|
||||||
matrixIndex = int(a_blendIndex[3]) * 3;
|
if (blendWeight > 0.0)
|
||||||
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
{
|
||||||
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
matrixIndex = int(a_blendIndex[3]) * 3;
|
||||||
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
matrixPalette1 += u_matrixPalette[matrixIndex] * blendWeight;
|
||||||
|
matrixPalette2 += u_matrixPalette[matrixIndex + 1] * blendWeight;
|
||||||
|
matrixPalette3 += u_matrixPalette[matrixIndex + 2] * blendWeight;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
vec4 _skinnedPosition;
|
||||||
_skinnedPosition.x = dot(a_position, matrixPalette1);
|
_skinnedPosition.x = dot(a_position, matrixPalette1);
|
||||||
_skinnedPosition.y = dot(a_position, matrixPalette2);
|
_skinnedPosition.y = dot(a_position, matrixPalette2);
|
||||||
_skinnedPosition.z = dot(a_position, matrixPalette3);
|
_skinnedPosition.z = dot(a_position, matrixPalette3);
|
||||||
|
|
Loading…
Reference in New Issue