Use half float for texture matrix
This commit is contained in:
parent
daf1294e6f
commit
ce45605c18
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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++)
|
||||
{
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
};
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user