Use glVertexAttrib only in debug view

This commit is contained in:
Benau 2017-12-27 13:50:17 +08:00
parent 62e0effed6
commit 52b19dd83a
5 changed files with 49 additions and 35 deletions

View File

@ -1517,6 +1517,10 @@ void drawNormal()
{
for (unsigned k = 0; k < p.second[j].second.size(); k++)
{
// Make sure tangents and joints are not drawn undefined
glVertexAttrib4f(5, 0.0f, 0.0f, 0.0f, 0.0f);
glVertexAttribI4i(6, 0, 0, 0, 0);
glVertexAttrib4f(7, 0.0f, 0.0f, 0.0f, 0.0f);
p.second[j].second[k].first->draw(DCT_NORMAL,
-1/*material_id*/);
}

View File

@ -176,8 +176,7 @@ void SPMeshBuffer::uploadGLMesh()
std::get<2>(m_stk_material[0])->getShaderName() == "normalmap" &&
CVS->isDefferedEnabled();
const unsigned pitch = 48 - (use_tangents ? 0 : 4) - (use_2_uv ? 0 : 4) -
(m_skinned ? 0 : 16) - (m_vertex_color ? 0 : 4) +
(CVS->useArrayTextures() ? 12 :
(m_skinned ? 0 : 16) + (CVS->useArrayTextures() ? 12 :
CVS->isARBBindlessTextureUsable() ? 48 : 0);
m_pitch = pitch;
@ -204,8 +203,6 @@ void SPMeshBuffer::uploadGLMesh()
memcpy(ptr + v_size + offset, &m_vertices[i].m_normal, 12);
offset += 4;
if (m_vertex_color)
{
video::SColor vc = m_vertices[i].m_color;
if (CVS->isDefferedEnabled() ||
CVS->isARBSRGBFramebufferUsable())
@ -217,7 +214,7 @@ void SPMeshBuffer::uploadGLMesh()
}
memcpy(ptr + v_size + offset, &vc, 4);
offset += 4;
}
memcpy(ptr + v_size + offset, &m_vertices[i].m_all_uvs[0], 4);
offset += 4;
if (use_2_uv)
@ -317,6 +314,7 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, pitch, (void*)offset);
offset += 12;
// Normal, if 10bit vector normalization is wrongly done by drivers, use
// original value and normalize ourselves in shader
glEnableVertexAttribArray(1);
@ -325,23 +323,13 @@ void SPMeshBuffer::recreateVAO(unsigned i)
(GraphicsRestrictions::GR_10BIT_VECTOR) ? GL_FALSE : GL_TRUE, pitch,
(void*)offset);
offset += 4;
// Vertex color
if (m_vertex_color)
{
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 4, GL_UNSIGNED_BYTE, GL_TRUE, pitch,
(void*)offset);
offset += 4;
}
else
{
glDisableVertexAttribArray(2);
#ifdef USE_GLES2
glVertexAttrib4f(2, 1.0f, 1.0f, 1.0f, 1.0f);
#else
glVertexAttrib4Nub(2, 255, 255, 255, 255);
#endif
}
// 1st texture coordinates
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 2, GL_HALF_FLOAT, GL_FALSE, pitch, (void*)offset);
@ -354,6 +342,11 @@ void SPMeshBuffer::recreateVAO(unsigned i)
(void*)offset);
offset += 4;
}
else
{
glDisableVertexAttribArray(4);
}
if (use_tangents)
{
// Tangent and bi-tanget sign
@ -364,6 +357,11 @@ void SPMeshBuffer::recreateVAO(unsigned i)
pitch, (void*)offset);
offset += 4;
}
else
{
glDisableVertexAttribArray(5);
}
if (m_skinned)
{
// 4 Joint indices
@ -376,6 +374,12 @@ void SPMeshBuffer::recreateVAO(unsigned i)
(void*)offset);
offset += 8;
}
else
{
glDisableVertexAttribArray(6);
glDisableVertexAttribArray(7);
}
if (CVS->useArrayTextures())
{
// uvec4 + uvec2 for 6 texture array indices
@ -385,6 +389,7 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glEnableVertexAttribArray(14);
glVertexAttribIPointer(14, 2, GL_UNSIGNED_SHORT, pitch, (void*)offset);
offset += 4;
glDisableVertexAttribArray(15);
}
else if (CVS->isARBBindlessTextureUsable())
{
@ -398,6 +403,13 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glEnableVertexAttribArray(15);
glVertexAttribIPointer(15, 4, GL_UNSIGNED_INT, pitch, (void*)offset);
}
else
{
glDisableVertexAttribArray(13);
glDisableVertexAttribArray(14);
glDisableVertexAttribArray(15);
}
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo);
glBindBuffer(GL_ARRAY_BUFFER, m_ins_array[i]);
// Origin

View File

@ -78,13 +78,11 @@ private:
bool m_skinned;
const bool m_vertex_color;
// ------------------------------------------------------------------------
bool initTexture();
public:
SPMeshBuffer(bool vertex_color = true) : m_vertex_color(vertex_color)
SPMeshBuffer()
{
#ifdef _DEBUG
setDebugName("SMeshBuffer");

View File

@ -277,7 +277,7 @@ void SPMeshLoader::decompressSPM(irr::io::IReadFile* spm,
assert(indices_count != 0);
using namespace SP;
SPMeshBuffer* mb = new SPMeshBuffer(read_vcolor);
SPMeshBuffer* mb = new SPMeshBuffer();
static_cast<SPMesh*>(m_mesh)->m_buffer.push_back(mb);
const unsigned idx_size = vertices_count > 255 ? 2 : 1;
for (unsigned i = 0; i < vertices_count; i++)

View File

@ -249,7 +249,7 @@ void Graph::createMeshSP(bool show_invisible, bool enable_transparency,
#ifndef SERVER_ONLY
SP::SPMesh* spm = new SP::SPMesh();
SP::SPMeshBuffer* spmb = new SP::SPMeshBuffer(true/*vertex_color*/);
SP::SPMeshBuffer* spmb = new SP::SPMeshBuffer();
m_mesh = spm;
m_mesh_buffer = spmb;