Init texture only once, not each frame
This commit is contained in:
parent
46396f4a7e
commit
00049f2f04
@ -128,19 +128,8 @@ void renderMeshes1stPass(const std::vector<TexUnit> &TexUnits, std::vector<STK::
|
||||
GLMesh &mesh = *(STK::tuple_get<0>(meshes->at(i)));
|
||||
for (unsigned j = 0; j < TexUnits.size(); j++)
|
||||
{
|
||||
if (!mesh.textures[TexUnits[j].m_id])
|
||||
mesh.textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha);
|
||||
if (UserConfigParams::m_azdo)
|
||||
{
|
||||
#ifdef Bindless_Texture_Support
|
||||
if (!mesh.TextureHandles[TexUnits[j].m_id])
|
||||
mesh.TextureHandles[TexUnits[j].m_id] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[TexUnits[j].m_id]), Shader::getInstance()->SamplersId[j]);
|
||||
if (!glIsTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]))
|
||||
glMakeTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]);
|
||||
#endif
|
||||
Handles.push_back(mesh.TextureHandles[TexUnits[j].m_id]);
|
||||
}
|
||||
else
|
||||
Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id]));
|
||||
}
|
||||
@ -211,12 +200,7 @@ void renderInstancedMeshes1stPass(const std::vector<TexUnit> &TexUnits, std::vec
|
||||
if (!irr_driver->hasARB_base_instance())
|
||||
glBindVertexArray(mesh.vao);
|
||||
for (unsigned j = 0; j < TexUnits.size(); j++)
|
||||
{
|
||||
if (!mesh.textures[TexUnits[j].m_id])
|
||||
mesh.textures[j] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha);
|
||||
Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id]));
|
||||
}
|
||||
Shader::getInstance()->SetTextureUnits(Textures);
|
||||
instanced_custom_unroll_args<List...>::template exec(Shader::getInstance(), meshes->at(i));
|
||||
}
|
||||
@ -412,19 +396,8 @@ void renderMeshes2ndPass(const std::vector<TexUnit> &TexUnits, std::vector<STK::
|
||||
GLMesh &mesh = *(STK::tuple_get<0>(meshes->at(i)));
|
||||
for (unsigned j = 0; j < TexUnits.size(); j++)
|
||||
{
|
||||
if (!mesh.textures[TexUnits[j].m_id])
|
||||
mesh.textures[TexUnits[j].m_id] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha);
|
||||
if (UserConfigParams::m_azdo)
|
||||
{
|
||||
#ifdef Bindless_Texture_Support
|
||||
if (!mesh.TextureHandles[TexUnits[j].m_id])
|
||||
mesh.TextureHandles[TexUnits[j].m_id] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[TexUnits[j].m_id]), Shader::getInstance()->SamplersId[Handles.size()]);
|
||||
if (!glIsTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]))
|
||||
glMakeTextureHandleResidentARB(mesh.TextureHandles[TexUnits[j].m_id]);
|
||||
Handles.push_back(mesh.TextureHandles[TexUnits[j].m_id]);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id]));
|
||||
}
|
||||
@ -457,13 +430,7 @@ void renderInstancedMeshes2ndPass(const std::vector<TexUnit> &TexUnits, std::vec
|
||||
|
||||
std::vector<GLuint> Textures(Prefilled_tex);
|
||||
for (unsigned j = 0; j < TexUnits.size(); j++)
|
||||
{
|
||||
if (!mesh.textures[TexUnits[j].m_id])
|
||||
mesh.textures[TexUnits[j].m_id] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh.textures[TexUnits[j].m_id], TexUnits[j].m_premul_alpha);
|
||||
Textures.push_back(getTextureGLuint(mesh.textures[TexUnits[j].m_id]));
|
||||
|
||||
}
|
||||
Shader::getInstance()->SetTextureUnits(Textures);
|
||||
instanced_custom_unroll_args<List...>::template exec(Shader::getInstance(), meshes->at(i));
|
||||
}
|
||||
@ -816,15 +783,7 @@ void renderShadow(const std::vector<GLuint> TextureUnits, unsigned cascade, cons
|
||||
{
|
||||
compressTexture(mesh->textures[TextureUnits[j]], true);
|
||||
if (UserConfigParams::m_azdo)
|
||||
{
|
||||
#ifdef Bindless_Texture_Support
|
||||
if (!mesh->TextureHandles[TextureUnits[j]])
|
||||
mesh->TextureHandles[TextureUnits[j]] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh->textures[TextureUnits[j]]), T::getInstance()->SamplersId[j]);
|
||||
if (!glIsTextureHandleResidentARB(mesh->TextureHandles[TextureUnits[j]]))
|
||||
glMakeTextureHandleResidentARB(mesh->TextureHandles[TextureUnits[j]]);
|
||||
#endif
|
||||
Handles.push_back(mesh->TextureHandles[TextureUnits[j]]);
|
||||
}
|
||||
else
|
||||
Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]]));
|
||||
}
|
||||
@ -885,11 +844,8 @@ void renderInstancedShadow(const std::vector<GLuint> TextureUnits, unsigned casc
|
||||
glBindVertexArray(mesh->vao_shadow_pass);
|
||||
|
||||
for (unsigned j = 0; j < TextureUnits.size(); j++)
|
||||
{
|
||||
compressTexture(mesh->textures[TextureUnits[j]], true);
|
||||
Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]]));
|
||||
|
||||
}
|
||||
T::getInstance()->SetTextureUnits(Textures);
|
||||
instanced_shadow_custom_unroll_args<List...>::template exec<T>(T::getInstance(), cascade, t->at(i));
|
||||
}
|
||||
@ -1071,12 +1027,7 @@ void drawRSM(const core::matrix4 & rsm_matrix, const std::vector<GLuint> &Textur
|
||||
std::vector<GLuint> Textures;
|
||||
GLMesh *mesh = STK::tuple_get<0>(t->at(i));
|
||||
for (unsigned j = 0; j < TextureUnits.size(); j++)
|
||||
{
|
||||
if (!mesh->textures[TextureUnits[j]])
|
||||
mesh->textures[TextureUnits[j]] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh->textures[TextureUnits[j]], true);
|
||||
Textures.push_back(getTextureGLuint(mesh->textures[TextureUnits[j]]));
|
||||
}
|
||||
T::getInstance()->SetTextureUnits(Textures);
|
||||
rsm_custom_unroll_args<Selector...>::template exec<T>(rsm_matrix, t->at(i));
|
||||
}
|
||||
|
@ -106,6 +106,7 @@ void STKAnimatedMesh::render()
|
||||
{
|
||||
MeshMaterial MatType = MaterialTypeToMeshMaterial(type, mb->getVertexType());
|
||||
MeshSolidMaterial[MatType].push_back(&mesh);
|
||||
InitTextures(mesh, MatType);
|
||||
}
|
||||
std::pair<unsigned, unsigned> p = VAOManager::getInstance()->getBase(mb);
|
||||
mesh.vaoBaseVertex = p.first;
|
||||
|
@ -124,6 +124,7 @@ void STKInstancedSceneNode::setFirstTimeMaterial()
|
||||
if (irr_driver->hasARB_base_instance())
|
||||
mesh.vaoBaseInstance = VAOManager::getInstance()->appendInstance(InstanceTypeDefault, instanceData[i]);
|
||||
MeshSolidMaterial[MatType].push_back(&mesh);
|
||||
InitTextures(mesh, MatType);
|
||||
}
|
||||
isMaterialInitialized = true;
|
||||
}
|
||||
|
@ -292,4 +292,46 @@ bool isObject(video::E_MATERIAL_TYPE type)
|
||||
if (type == video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF)
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
static void
|
||||
SetTexture(GLMesh &mesh, unsigned i, bool isSrgb)
|
||||
{
|
||||
if (!mesh.textures[i])
|
||||
mesh.textures[i] = getUnicolorTexture(video::SColor(255, 255, 255, 255));
|
||||
compressTexture(mesh.textures[i], isSrgb);
|
||||
if (UserConfigParams::m_azdo)
|
||||
{
|
||||
if (!mesh.TextureHandles[i])
|
||||
mesh.TextureHandles[i] = glGetTextureSamplerHandleARB(getTextureGLuint(mesh.textures[i]), MeshShader::ObjectPass1Shader::getInstance()->SamplersId[0]);
|
||||
if (!glIsTextureHandleResidentARB(mesh.TextureHandles[i]))
|
||||
glMakeTextureHandleResidentARB(mesh.TextureHandles[i]);
|
||||
}
|
||||
}
|
||||
|
||||
void InitTextures(GLMesh &mesh, MeshMaterial Mat)
|
||||
{
|
||||
switch (Mat)
|
||||
{
|
||||
default:
|
||||
case MAT_DEFAULT:
|
||||
case MAT_ALPHA_REF:
|
||||
case MAT_GRASS:
|
||||
case MAT_SPHEREMAP:
|
||||
case MAT_UNLIT:
|
||||
SetTexture(mesh, 0, true);
|
||||
break;
|
||||
case MAT_DETAIL:
|
||||
case MAT_NORMAL_MAP:
|
||||
SetTexture(mesh, 0, true);
|
||||
SetTexture(mesh, 1, false);
|
||||
break;
|
||||
case MAT_SPLATTING:
|
||||
SetTexture(mesh, 0, true);
|
||||
SetTexture(mesh, 1, true);
|
||||
SetTexture(mesh, 2, true);
|
||||
SetTexture(mesh, 3, true);
|
||||
SetTexture(mesh, 4, true);
|
||||
break;
|
||||
}
|
||||
}
|
@ -109,4 +109,6 @@ void drawBubble(const GLMesh &mesh, const core::matrix4 &ModelViewProjectionMatr
|
||||
MeshMaterial MaterialTypeToMeshMaterial(video::E_MATERIAL_TYPE, video::E_VERTEX_TYPE);
|
||||
TransparentMaterial MaterialTypeToTransparentMaterial(video::E_MATERIAL_TYPE, f32 MaterialTypeParam);
|
||||
|
||||
void InitTextures(GLMesh &mesh, MeshMaterial);
|
||||
|
||||
#endif // STKMESH_H
|
||||
|
@ -90,7 +90,10 @@ void STKMeshSceneNode::setFirstTimeMaterial()
|
||||
glBindVertexArray(0);
|
||||
}
|
||||
else
|
||||
{
|
||||
InitTextures(mesh, MatType);
|
||||
MeshSolidMaterials[MatType].push_back(&mesh);
|
||||
}
|
||||
}
|
||||
|
||||
if (!immediate_draw)
|
||||
|
Loading…
x
Reference in New Issue
Block a user