Use half float for texture matrix

This commit is contained in:
Benau 2017-12-26 15:28:01 +08:00
parent daf1294e6f
commit ce45605c18
8 changed files with 45 additions and 68 deletions

View File

@ -19,12 +19,7 @@ layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale;
#if defined(Converts_10bit_Vector)
layout(location = 11) in int i_misc_data_pked;
#else
layout(location = 11) in vec4 i_misc_data;
#endif
layout(location = 12) in ivec2 i_misc_data_two;
#if defined(Use_Bindless_Texture)
layout(location = 13) in uvec4 i_bindless_texture_0;
@ -63,7 +58,6 @@ void main()
#if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_misc_data = convert10BitVector(i_misc_data_pked);
#endif
#if defined(Use_Bindless_Texture)
@ -92,6 +86,6 @@ void main()
normal = (u_view_matrix * vec4(world_normal, 0.0)).xyz;
uv = i_uv;
hue_change = i_misc_data.z;
hue_change = float(i_misc_data_two.y) * 0.01;
gl_Position = u_projection_view_matrix * world_position;
}

View File

@ -19,7 +19,7 @@ layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale;
layout(location = 12) in int i_skinning_offset;
layout(location = 12) in ivec2 i_misc_data_two;
#stk_include "utils/get_world_location.vert"
@ -38,23 +38,24 @@ void main()
vec4 idle_normal = vec4(i_normal.xyz, 0.0);
vec4 skinned_position = vec4(0.0);
vec4 skinned_normal = vec4(0.0);
int skinning_offset = i_misc_data_two.x;
for (int i = 0; i < 4; i++)
{
mat4 joint_matrix = mat4(
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 1),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 1),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 2),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 2),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 3));
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 3));
skinned_position += i_weight[i] * joint_matrix * idle_position;
skinned_normal += i_weight[i] * joint_matrix * idle_normal;
}
float step_mix = step(float(i_skinning_offset), -32769.0);
float step_mix = step(float(skinning_offset), -32769.0);
skinned_position = mix(idle_position, skinned_position, step_mix);
skinned_normal = mix(idle_normal, skinned_normal, step_mix);

View File

@ -25,12 +25,8 @@ layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale;
#if defined(Converts_10bit_Vector)
layout(location = 11) in int i_misc_data_pked;
#else
layout(location = 11) in vec4 i_misc_data;
#endif
layout(location = 11) in vec2 i_misc_data;
layout(location = 12) in ivec2 i_misc_data_two;
#if defined(Use_Bindless_Texture)
layout(location = 13) in uvec4 i_bindless_texture_0;
@ -75,7 +71,6 @@ void main()
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_tangent = convert10BitVector(i_tangent_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_misc_data = convert10BitVector(i_misc_data_pked);
#endif
#if defined(Use_Bindless_Texture)
@ -113,6 +108,6 @@ void main()
color = i_color.zyxw;
camdist = length(u_view_matrix * world_position);
hue_change = i_misc_data.z;
hue_change = float(i_misc_data_two.y) * 0.01;
gl_Position = u_projection_view_matrix * world_position;
}

View File

@ -32,14 +32,8 @@ layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale;
#if defined(Converts_10bit_Vector)
layout(location = 11) in int i_misc_data_pked;
#else
layout(location = 11) in vec4 i_misc_data;
#endif
layout(location = 12) in int i_skinning_offset;
layout(location = 11) in vec2 i_misc_data;
layout(location = 12) in ivec2 i_misc_data_two;
#if defined(Use_Bindless_Texture)
layout(location = 13) in uvec4 i_bindless_texture_0;
@ -84,7 +78,6 @@ void main()
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_tangent = convert10BitVector(i_tangent_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_misc_data = convert10BitVector(i_misc_data_pked);
#endif
#if defined(Use_Bindless_Texture)
@ -109,29 +102,30 @@ void main()
vec4 skinned_position = vec4(0.0);
vec4 skinned_normal = vec4(0.0);
vec4 skinned_tangent = vec4(0.0);
int skinning_offset = i_misc_data_two.x;
for (int i = 0; i < 4; i++)
{
#ifdef GL_ES
mat4 joint_matrix = mat4(
texelFetch(skinning_tex, ivec2
(0 , clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(0 , clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(1, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(1, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(2, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(2, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(3, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0));
(3, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0));
#else
mat4 joint_matrix = mat4(
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 1),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 1),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 2),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 2),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 3));
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 3));
#endif
skinned_position += i_weight[i] * joint_matrix * idle_position;
skinned_normal += i_weight[i] * joint_matrix * idle_normal;
@ -157,6 +151,6 @@ void main()
color = i_color.zyxw;
camdist = length(u_view_matrix * world_position);
hue_change = i_misc_data.z;
hue_change = float(i_misc_data_two.y) * 0.01;
gl_Position = u_projection_view_matrix * world_position;
}

View File

@ -20,7 +20,7 @@ layout(location = 9) in vec4 i_rotation;
#endif
layout(location = 10) in vec4 i_scale;
layout(location = 12) in int i_skinning_offset;
layout(location = 12) in ivec2 i_misc_data_two;
#if defined(Use_Bindless_Texture)
layout(location = 13) in uvec4 i_bindless_texture_0;
@ -80,29 +80,30 @@ void main()
vec4 idle_position = vec4(i_position, 1.0);
vec4 skinned_position = vec4(0.0);
int skinning_offset = i_misc_data_two.x;
for (int i = 0; i < 4; i++)
{
#ifdef GL_ES
mat4 joint_matrix = mat4(
texelFetch(skinning_tex, ivec2
(0, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(0, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(1, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(1, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(2, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0),
(2, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0),
texelFetch(skinning_tex, ivec2
(3, clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES)), 0));
(3, clamp(i_joint[i] + skinning_offset, 0, MAX_BONES)), 0));
#else
mat4 joint_matrix = mat4(
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 1),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 1),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 2),
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 2),
texelFetch(skinning_tex,
clamp(i_joint[i] + i_skinning_offset, 0, MAX_BONES) * 4 + 3));
clamp(i_joint[i] + skinning_offset, 0, MAX_BONES) * 4 + 3));
#endif
skinned_position += i_weight[i] * joint_matrix * idle_position;
}

View File

@ -1261,7 +1261,7 @@ void addObject(SPMeshNode* node)
}
SPInstancedData id = SPInstancedData
(node->getAbsoluteTransformation(), tm_x, tm_y, hue,
node->getSkinningOffset());
(short)node->getSkinningOffset());
for (int dc_type = 0; dc_type < (g_handle_shadow ? 5 : 1); dc_type++)
{

View File

@ -37,7 +37,7 @@ public:
// ------------------------------------------------------------------------
SPInstancedData(const core::matrix4& model_mat,
float texture_trans_x, float texture_trans_y, float hue,
int skinning_offset)
short skinning_offset)
{
using namespace MiniGLM;
float position[3] = { model_mat[12], model_mat[13], model_mat[14] };
@ -66,10 +66,11 @@ public:
short s[4] = { toFloat16(scale.X), toFloat16(scale.Y),
toFloat16(scale.Z), toFloat16(rotation.W) };
memcpy(m_data + 16, s, 8);
_2101010 = normalizedSignedFloatsTo1010102(
{{ texture_trans_x, texture_trans_y, hue, 0.0f }});
memcpy(m_data + 24, &_2101010, 4);
memcpy(m_data + 28, &skinning_offset, 4);
short tm[2] = { toFloat16(texture_trans_x), toFloat16(texture_trans_y) };
memcpy(m_data + 24, tm, 4);
memcpy(m_data + 28, &skinning_offset, 2);
short hue_packed = short(core::clamp(int(hue * 100.0f), 0, 100));
memcpy(m_data + 30, &hue_packed, 2);
}
};

View File

@ -433,22 +433,13 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glEnableVertexAttribArray(10);
glVertexAttribPointer(10, 4, GL_HALF_FLOAT, GL_FALSE, 32, (void*)16);
glVertexAttribDivisorARB(10, 1);
// Misc data (texture translation and hue change)
// Misc data (texture translation)
glEnableVertexAttribArray(11);
if (GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR))
{
glVertexAttribIPointer(11, 1, GL_INT, 32, (void*)24);
}
else
{
glVertexAttribPointer(11, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 32,
(void*)24);
}
glVertexAttribPointer(11, 2, GL_HALF_FLOAT, GL_FALSE, 32, (void*)24);
glVertexAttribDivisorARB(11, 1);
// Skinning offset
// Misc data (skinning offset and hue change)
glEnableVertexAttribArray(12);
glVertexAttribIPointer(12, 1, GL_INT, 32, (void*)28);
glVertexAttribIPointer(12, 2, GL_SHORT, 32, (void*)28);
glVertexAttribDivisorARB(12, 1);
glBindVertexArray(0);