Normalize in shader for broken drivers

This commit is contained in:
Benau 2017-12-27 11:33:30 +08:00
parent 891b053358
commit dbc3cd5ff5
11 changed files with 49 additions and 80 deletions

View File

@ -3,7 +3,7 @@ uniform vec3 wind_direction;
layout(location = 0) in vec3 i_position;
#if defined(Converts_10bit_Vector)
layout(location = 1) in int i_normal_pked;
layout(location = 1) in vec4 i_normal_orig;
#else
layout(location = 1) in vec4 i_normal;
#endif
@ -13,7 +13,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -56,8 +56,8 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -7,7 +7,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -47,7 +47,7 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -21,7 +21,7 @@ void main()
vec3 V1 = gl_in[2].gl_Position.xyz - gl_in[1].gl_Position.xyz;
// calculate normal as perpendicular to two vectors of the triangle
vec3 V0_V1_crossed = cross(V1, V0);
float normal_scale = clamp(length(V0_V1_crossed) * 10.0, 0.0, 0.25);
float normal_scale = min(length(V0_V1_crossed) * 10.0, 0.25);
vec3 N = normalize(V0_V1_crossed);
// normals of each vertex of the triangle

View File

@ -3,13 +3,13 @@ uniform samplerBuffer skinning_tex;
layout(location = 0) in vec3 i_position;
#if defined(Converts_10bit_Vector)
layout(location = 1) in int i_normal_pked;
layout(location = 1) in vec4 i_normal_orig;
#else
layout(location = 1) in vec4 i_normal;
#endif
#if defined(Converts_10bit_Vector)
layout(location = 5) in int i_tangent_pked;
layout(location = 5) in vec4 i_tangent_orig;
#else
layout(location = 5) in vec4 i_tangent;
#endif
@ -19,7 +19,7 @@ layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -37,9 +37,9 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_tangent = convert10BitVector(i_tangent_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
vec4 idle_position = vec4(i_position, 1.0);

View File

@ -1,7 +1,7 @@
layout(location = 0) in vec3 i_position;
#if defined(Converts_10bit_Vector)
layout(location = 1) in int i_normal_pked;
layout(location = 1) in vec4 i_normal_orig;
#else
layout(location = 1) in vec4 i_normal;
#endif
@ -11,7 +11,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 4) in vec2 i_uv_two;
#if defined(Converts_10bit_Vector)
layout(location = 5) in int i_tangent_pked;
layout(location = 5) in vec4 i_tangent_orig;
#else
layout(location = 5) in vec4 i_tangent;
#endif
@ -19,7 +19,7 @@ layout(location = 5) in vec4 i_tangent;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -68,9 +68,9 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_tangent = convert10BitVector(i_tangent_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -5,7 +5,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -45,7 +45,7 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -6,7 +6,7 @@ uniform samplerBuffer skinning_tex;
layout(location = 0) in vec3 i_position;
#if defined(Converts_10bit_Vector)
layout(location = 1) in int i_normal_pked;
layout(location = 1) in vec4 i_normal_orig;
#else
layout(location = 1) in vec4 i_normal;
#endif
@ -16,7 +16,7 @@ layout(location = 3) in vec2 i_uv;
layout(location = 4) in vec2 i_uv_two;
#if defined(Converts_10bit_Vector)
layout(location = 5) in int i_tangent_pked;
layout(location = 5) in vec4 i_tangent_orig;
#else
layout(location = 5) in vec4 i_tangent;
#endif
@ -26,7 +26,7 @@ layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -75,9 +75,9 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_normal = convert10BitVector(i_normal_pked);
vec4 i_tangent = convert10BitVector(i_tangent_pked);
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_normal = convert10BitVector(i_normal_orig);
vec4 i_tangent = convert10BitVector(i_tangent_orig);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -14,7 +14,7 @@ layout(location = 7) in vec4 i_weight;
layout(location = 8) in vec3 i_origin;
#if defined(Converts_10bit_Vector)
layout(location = 9) in int i_rotation_pked;
layout(location = 9) in vec4 i_rotation_orig;
#else
layout(location = 9) in vec4 i_rotation;
#endif
@ -55,7 +55,7 @@ void main()
{
#if defined(Converts_10bit_Vector)
vec4 i_rotation = convert10BitVector(i_rotation_pked);
vec4 i_rotation = convert10BitVector(i_rotation_orig);
#endif
#if defined(Use_Bindless_Texture)

View File

@ -11,24 +11,12 @@ vec4 getWorldPosition(vec3 origin, vec4 rotation, vec3 scale, vec3 local_pos)
return vec4(local_pos, 1.0);
}
vec4 convert10BitVector(int pked)
vec4 convert10BitVector(vec4 orig)
{
vec4 ret;
int part = pked & 1023;
float part_mix = float(clamp(int(part & 512), 0, 1));
ret.x = mix(float(part), float(-1024 + part), part_mix) * 0.00195694715;
part = (pked >> 10) & 1023;
part_mix = float(clamp(int(part & 512), 0, 1));
ret.y = mix(float(part), float(-1024 + part), part_mix) * 0.00195694715;
part = (pked >> 20) & 1023;
part_mix = float(clamp(int(part & 512), 0, 1));
ret.z = mix(float(part), float(-1024 + part), part_mix) * 0.00195694715;
part = pked >> 30;
part_mix = float(clamp(int(part & 2), 0, 1));
ret.w = mix(float(part), -1.0f, part_mix);
ret.x = orig.x * 0.00195694715;
ret.y = orig.y * 0.00195694715;
ret.z = orig.z * 0.00195694715;
ret.w = max(orig.w, -1.0);
return ret;
}

View File

@ -1,5 +1,4 @@
// SuperTuxKart - a fun racing game with go-kart
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2017 SuperTuxKart-Team
//
// This program is free software; you can redistribute it and/or

View File

@ -317,18 +317,13 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, pitch, (void*)offset);
offset += 12;
// Normal
// Normal, if 10bit vector normalization is wrongly done by drivers, use
// original value and normalize ourselves in shader
glEnableVertexAttribArray(1);
if (GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR))
{
glVertexAttribIPointer(1, 1, GL_INT, pitch, (void*)offset);
}
else
{
glVertexAttribPointer(1, 4, GL_INT_2_10_10_10_REV, GL_TRUE, pitch,
(void*)offset);
}
glVertexAttribPointer(1, 4, GL_INT_2_10_10_10_REV,
GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR) ? GL_FALSE : GL_TRUE, pitch,
(void*)offset);
offset += 4;
// Vertex color
if (m_vertex_color)
@ -363,18 +358,11 @@ void SPMeshBuffer::recreateVAO(unsigned i)
{
// Tangent and bi-tanget sign
glEnableVertexAttribArray(5);
if (GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR))
{
glVertexAttribIPointer(5, 1, GL_INT, pitch,
(void*)offset);
}
else
{
glVertexAttribPointer(5, 4, GL_INT_2_10_10_10_REV, GL_TRUE, pitch,
(void*)offset);
}
offset += 4;
glVertexAttribPointer(5, 4, GL_INT_2_10_10_10_REV,
GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR) ? GL_FALSE : GL_TRUE,
pitch, (void*)offset);
offset += 4;
}
if (m_skinned)
{
@ -418,16 +406,10 @@ void SPMeshBuffer::recreateVAO(unsigned i)
glVertexAttribDivisorARB(8, 1);
// Rotation (quaternion .xyz)
glEnableVertexAttribArray(9);
if (GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR))
{
glVertexAttribIPointer(9, 1, GL_INT, 32, (void*)12);
}
else
{
glVertexAttribPointer(9, 4, GL_INT_2_10_10_10_REV, GL_TRUE, 32,
(void*)12);
}
glVertexAttribPointer(9, 4, GL_INT_2_10_10_10_REV,
GraphicsRestrictions::isDisabled
(GraphicsRestrictions::GR_10BIT_VECTOR) ? GL_FALSE : GL_TRUE, 32,
(void*)12);
glVertexAttribDivisorARB(9, 1);
// Scale (3 half floats and .w for quaternion .w)
glEnableVertexAttribArray(10);