The Elder Scrolls V: Skyrim Special Edition
  5 / 17    
[quote="zig11727"] Rise of the Tombraider (Steam Version) and Dues EX have a DX12 option.[/quote] I know, but they also have a DX11 mode, so a DX12 tool for 3D fixes isn't needed (I mean, that having the need may push people to do something about it). About the remaining water problem (most noticeable when you look from above), I'm stuck. Here is an example: How it should be: [img]http://u.cubeupload.com/masterotaku/skyrimseright.jpg[/img] How it looks: [img]http://u.cubeupload.com/masterotaku/skyrimsewrong.jpg[/img] Shader example (all of the water shaders are almost the same. 34defe3d2db150e2-ps_replace.txt, without the ASM code to make it shorter here): [code] //Water PS 9. // ---- Created with 3Dmigoto v1.2.45 on Sat Oct 29 17:59:54 2016 Texture2D<float4> t11 : register(t11); Texture2D<float4> t10 : register(t10); Texture2D<float4> t9 : register(t9); Texture2D<float4> t8 : register(t8); Texture2D<float4> t7 : register(t7); Texture2D<float4> t6 : register(t6); Texture2D<float4> t5 : register(t5); Texture2D<float4> t4 : register(t4); TextureCube<float4> t3 : register(t3); Texture2D<float4> t1 : register(t1); SamplerState s11_s : register(s11); SamplerState s10_s : register(s10); SamplerState s9_s : register(s9); SamplerState s8_s : register(s8); SamplerState s6_s : register(s6); SamplerState s5_s : register(s5); SamplerState s4_s : register(s4); SamplerState s3_s : register(s3); SamplerState s1_s : register(s1); cbuffer cb2 : register(b2) { float4 cb2[6]; } cbuffer cb1 : register(b1) { float4 cb1[14]; } cbuffer cb0 : register(b0) { float4 cb0[5]; } cbuffer cb12 : register(b12) { float4 cb12[45]; } // 3Dmigoto declarations #define cmp - Texture1D<float4> IniParams : register(t120); Texture2D<float4> StereoParams : register(t125); void main( float4 v0 : SV_POSITION0, float4 v1 : COLOR0, float4 v2 : TEXCOORD0, float4 v3 : TEXCOORD1, float4 v4 : TEXCOORD2, float4 v5 : TEXCOORD3, nointerpolation float4 v6 : TEXCOORD4, float4 v7 : TEXCOORD5, out float4 o0 : SV_Target0) { float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9; uint4 bitmask, uiDest; float4 fDest; float4 stereo = StereoParams.Load(0); float separation = stereo.x; float convergence = stereo.y; r0.yw = float2(0,0); r1.xy = float2(64,128) * v6.xx; r2.w = 1 / r1.y; r1.xy = v4.zw * r1.xx; r1.xy = frac(r1.xy); r1.xy = r1.xy * float2(2,2) + float2(-1,-1); r1.xy = float2(-0.5,-0.5) + abs(r1.xy); r1.xy = float2(0.5,0.5) + -r1.xy; r2.yz = float2(0,0); r3.xyzw = v4.zwzw + r2.wzzw; r1.zw = v4.zw + r2.ww; r4.xyzw = t8.Sample(s8_s, r1.zw).xyzw; r5.xyzw = t8.Sample(s8_s, r3.zw).xyzw; r3.xyzw = t8.Sample(s8_s, r3.xy).xyzw; r1.z = 0.00100000005 * cb1[2].w; r1.w = r1.z * r5.w; r0.z = 10.6400003 * r1.w; r6.xy = r5.xy * float2(2,2) + float2(-1,-1); r6.z = -r6.y; r1.w = 1.00999999 + -cb1[4].y; r1.w = sqrt(r1.w); r2.zw = v5.xy * r1.ww; r2.zw = float2(64,64) * r2.zw; r5.x = dot(r6.xz, r2.zw); r5.y = dot(r6.yx, r2.zw); r0.zw = r5.xy + -r0.zw; r0.zw = float2(0.270000011,0.270000011) + r0.zw; r0.zw = t9.Sample(s9_s, r0.zw).xy; r1.w = r1.z * r4.w; r5.x = 9.92000008 * r1.w; r5.y = 0; r6.xy = r4.xy * float2(2,2) + float2(-1,-1); r6.z = -r6.y; r4.x = dot(r6.xz, r2.zw); r4.y = dot(r6.yx, r2.zw); r4.xy = r4.xy + -r5.xy; r4.xy = t9.Sample(s9_s, r4.xy).xy; r5.xy = float2(1,1) + -r1.xy; r4.xy = r5.xx * r4.xy; r0.zw = r1.xx * r0.zw + r4.xy; r0.zw = r5.yy * r0.zw; r6.xyzw = t8.Sample(s8_s, v4.zw).xyzw; r1.w = r6.w * r1.z; r1.z = r1.z * r3.w; r0.x = 8.47999954 * r1.z; r2.x = 8 * r1.w; r7.xy = r6.xy * float2(2,2) + float2(-1,-1); r7.z = -r7.y; r4.x = dot(r7.xz, r2.zw); r4.y = dot(r7.yx, r2.zw); r1.zw = r4.xy + -r2.xy; r1.zw = t9.Sample(s9_s, r1.zw).xy; r7.xy = r3.xy * float2(2,2) + float2(-1,-1); r2.x = r5.x * r3.z; r2.x = r1.x * r6.z + r2.x; r7.z = -r7.y; r3.x = dot(r7.xz, r2.zw); r3.y = dot(r7.yx, r2.zw); r0.xy = r3.xy + -r0.xy; r0.xy = float2(0.620000005,0.620000005) + r0.xy; r0.xy = t9.Sample(s9_s, r0.xy).xy; r0.xy = r5.xx * r0.xy; r0.xy = r1.xx * r1.zw + r0.xy; r0.xy = r1.yy * r0.xy + r0.zw; r0.xy = float2(-0.5,-0.5) + r0.xy; r0.zw = r5.xy * r5.xy; r0.zw = r1.xy * r1.xy + r0.zw; r0.zw = sqrt(r0.zw); r0.z = r0.w * r0.z; r0.xy = r0.xy / r0.zz; r3.zw = float2(0,0); r0.zw = cb12[44].xy * v0.xy; r1.zw = cb12[43].xy * r0.zw; r3.xy = (int2)r1.zw; r1.z = t7.Load(r3.xyz).x; r1.z = -r1.z * cb0[2].z + cb0[2].x; r3.z = cb0[2].w / r1.z; r6.xy = r0.zw * cb0[0].xy + cb0[0].zw; r1.zw = r6.xy * float2(2,2) + float2(-1,-1); r1.zw = r1.zw * r3.zz; r3.xy = r1.zw / cb2[5].xy; r1.z = dot(r3.xyz, r3.xyz); r1.z = sqrt(r1.z); r1.w = dot(v2.xyz, v2.xyz); r1.w = rsqrt(r1.w); r2.yzw = v2.xyz * r1.www; r3.xyz = -r2.yzw * r1.zzz; r1.z = dot(r3.xyz, cb2[4].xyz); r1.w = dot(r3.xyz, r3.xyz); r1.w = sqrt(r1.w); r3.x = cb2[4].w / r1.z; r3.x = 1 + -r3.x; r1.z = r3.x * abs(r1.z); r1.w = r3.x * r1.w; r3.xyzw = saturate(r1.wwzz / cb1[10].zzzz); r7.xyzw = float4(-1,-1,-1,-1) + r3.xyzw; r7.xyzw = cb1[11].xyzw * r7.xyzw + float4(1,1,1,1); r1.z = max(0.400000006, r7.z); r8.xy = r1.zz * r0.xy; r0.x = -r8.x * r8.x + 1; r0.x = -r8.y * r8.y + r0.x; r8.z = sqrt(r0.x); r3.xzw = t5.Sample(s5_s, v3.zw).xyz; r3.xzw = r3.xzw * float3(2,2,2) + float3(-1,-1,-1); r4.xyw = t4.Sample(s4_s, v3.xy).xyz; r9.xyz = r4.xyw * float3(2,2,2) + float3(-1,-1,-2); r4.xyw = r4.xyw * float3(2,2,2) + float3(-1,-1,-1); r9.xyz = cb1[6].xxx * r9.xyz + float3(0,0,1); r3.xzw = cb1[6].yyy * r3.xzw + r9.xyz; r9.xyz = t6.Sample(s6_s, v4.xy).xyz; r9.xyz = r9.xyz * float3(2,2,2) + float3(-1,-1,-1); r3.xzw = cb1[6].zzz * r9.xyz + r3.xzw; r0.x = dot(r3.xzw, r3.xzw); r0.x = rsqrt(r0.x); r3.xzw = r3.xzw * r0.xxx + float3(-0,-0,-1); r3.xzw = r7.zzz * r3.xzw + float3(0,0,1); r0.x = dot(r3.xzw, r3.xzw); r0.x = rsqrt(r0.x); r8.xyz = -r3.xzw * r0.xxx + r8.xyz; r3.xzw = r3.xzw * r0.xxx; r0.x = r5.x * r4.z; r0.x = r1.x * r5.z + r0.x; r0.x = r5.y * r0.x; r0.x = r1.y * r2.x + r0.x; r1.xyz = r0.xxx * r8.xyz + r3.xzw; r0.x = dot(r1.xyz, r1.xyz); r0.x = rsqrt(r0.x); r1.xyz = r1.xyz * r0.xxx + -r4.xyw; r0.x = -8192 + v2.w; r0.y = -8192 + cb1[7].x; r0.x = r0.x / r0.y; r0.y = 1 + -cb12[42].w; r0.x = saturate(r0.x * r0.y + cb12[42].w); r1.xyz = r0.xxx * r1.xyz + r4.xyw; r0.y = dot(r1.xyz, r1.xyz); r0.y = rsqrt(r0.y); r1.xyz = r1.xyz * r0.yyy; r0.y = cb1[5].w * r7.y; r4.xy = r0.yy * r1.xy + v7.xy; r4.z = v7.z; r4.w = 1; r0.y = dot(cb2[1].xyzw, r4.xyzw); r5.z = dot(cb2[3].xyzw, r4.xyzw); r5.x = dot(cb2[0].xyzw, r4.xyzw); r5.x+=separation*(r5.z-convergence)*0.5; r5.y = r5.z + -r0.y; r3.xz = r5.xy / r5.zz; r4.xy = cb0[0].zw + r3.xz; r3.xz = r3.xz / cb0[0].xy; r3.xz = cb12[43].xy * r3.xz; r8.xy = (int2)r3.xz; r3.xz = r4.xy * float2(2,2) + float2(-1,-1); r8.zw = float2(0,0); r0.y = t7.Load(r8.xyz).x; r0.y = -r0.y * cb0[2].z + cb0[2].x; r4.z = cb0[2].w / r0.y; r3.xz = r4.zz * r3.xz; r4.xy = r3.xz / cb2[5].xy; r0.y = dot(r4.xyz, r4.xyz); r0.y = sqrt(r0.y); r3.xzw = -r2.yzw * r0.yyy; r0.y = dot(r3.xzw, cb2[4].xyz); r1.w = cmp(0 < r0.y); r2.x = cmp(r0.y < 0); r0.y = cb2[4].w / r0.y; r0.y = 1 + -r0.y; r1.w = (int)-r1.w + (int)r2.x; r1.w = (int)r1.w; r0.y = r1.w * r0.y; r0.y = cmp(r0.y < 0); r6.z = 1; r3.xzw = r0.yyy ? r6.xyz : r5.xyz; r3.xz = r3.xz / r3.ww; r3.xz = cb12[43].xy * r3.xz; r3.xz = max(float2(0,0), r3.xz); r4.x = cb12[44].z; r4.y = cb12[43].y; r3.xz = min(r4.xy, r3.xz); r3.xzw = t1.Sample(s1_s, r3.xz).xyz; r5.xyz = cb1[1].xyz + -cb1[0].xyz; r5.xyz = r3.yyy * r5.xyz + cb1[0].xyz; r0.y = -r3.y * cb1[10].z + cb1[10].z; r0.y = saturate(r0.y / cb1[10].w); r0.y = log2(r0.y); r0.y = cb1[8].w * r0.y; r0.y = exp2(r0.y); r0.y = 1 + -r0.y; r5.xyz = -r3.xzw * cb1[7].www + r5.xyz; r3.xyz = cb1[7].www * r3.xzw; r3.xyz = r0.yyy * r5.xyz + r3.xyz; r4.zw = cb1[13].xx * r1.xy; r0.yz = r0.zw * cb1[12].zw + r4.zw; r0.yz = cb12[43].xy * r0.yz; r0.yz = max(float2(0,0), r0.yz); r0.yz = min(r0.yz, r4.xy); r4.xyzw = t10.Sample(s10_s, r0.yz).xyzw; r5.xyzw = t11.Sample(s11_s, r0.yz).xyzw; r4.xyzw = -r5.xyzw + r4.xyzw; r4.xyzw = cb1[12].yyyy * r4.xyzw + r5.xyzw; r5.x = 0; r5.z = 1 + -cb1[7].y; r0.yzw = cb1[7].yyy * r1.xyz + r5.xxz; r1.w = dot(r2.yzw, r0.yzw); r1.w = r1.w + r1.w; r0.yzw = r0.yzw * -r1.www + r2.yzw; r0.yzw = t3.Sample(s3_s, r0.yzw).xyz; r4.xyz = -r0.yzw * cb1[7].www + r4.xyz; r0.yzw = cb1[7].www * r0.yzw; r1.w = cb1[12].x * r0.x; r1.w = saturate(r4.w * r1.w); r0.yzw = r1.www * r4.xyz + r0.yzw; r0.yzw = -cb1[2].xyz + r0.yzw; r0.yzw = cb1[5].yyy * r0.yzw + cb1[2].xyz; r0.yzw = r0.yzw + -r3.xyz; r1.w = saturate(dot(-r2.yzw, r1.xyz)); r1.w = 1 + -r1.w; r2.x = r1.w * r1.w; r2.x = r2.x * r2.x; r1.w = r2.x * r1.w; r2.x = 1 + -cb1[3].x; r1.w = r2.x * r1.w + cb1[3].x; r1.w = r1.w * r7.x + -1; r0.x = r0.x * r1.w + 1; r0.xyz = r0.xxx * r0.yzw + r3.xyz; r0.w = dot(r2.yzw, r1.xyz); r0.w = r0.w + r0.w; r2.xyz = r1.xyz * -r0.www + r2.yzw; r0.w = saturate(dot(r1.xyz, float3(-0.0989999995,-0.0989999995,0.99000001))); r0.w = log2(r0.w); r0.w = cb1[0].w * r0.w; r0.w = exp2(r0.w); r1.x = saturate(dot(r2.xyz, cb0[3].xyz)); r1.x = log2(r1.x); r1.x = cb1[5].x * r1.x; r1.x = exp2(r1.x); r1.yzw = cb0[4].xyz * cb0[3].www; r2.xyz = r1.xxx * r1.yzw; r1.xyz = r1.yzw * r0.www; r1.xyz = cb1[7].zzz * r1.xyz; r1.xyz = r2.xyz * cb1[1].www + r1.xyz; r0.xyz = r1.xyz * r7.www + r0.xyz; r1.xyz = v1.xyz + -r0.xyz; r0.xyz = v1.www * r1.xyz + r0.xyz; r0.w = cb0[1].w; o0.xyz = saturate(r0.xyz * r0.www); o0.w = saturate(0); return; } [/code] The "r5.x+=separation*(r5.z-convergence)*0.5;" correction is for water refraction. I think that the "r1.w = dot(v2.xyz, v2.xyz);" line is what I have to fix. "v2" comes from "o2" in the vertex shader (I picked a random water vertex shader here): [code] //Water VS 4. // ---- Created with 3Dmigoto v1.2.45 on Sat Oct 29 12:27:52 2016 cbuffer cb2 : register(b2) { float4 cb2[13]; } cbuffer cb1 : register(b1) { float4 cb1[6]; } cbuffer cb0 : register(b0) { float4 cb0[1]; } // 3Dmigoto declarations #define cmp - Texture1D<float4> IniParams : register(t120); Texture2D<float4> StereoParams : register(t125); void main( float4 v0 : POSITION0, float2 v1 : TEXCOORD0, out float4 o0 : SV_POSITION0, out float4 o1 : COLOR0, out float4 o2 : TEXCOORD0, out float4 o3 : TEXCOORD1, out float4 o4 : TEXCOORD2, out float4 o5 : TEXCOORD5) { float4 r0,r1,r2,r3; uint4 bitmask, uiDest; float4 fDest; float4 stereo = StereoParams.Load(0); float separation = stereo.x; float convergence = stereo.y; r0.xyz = v0.xyz; r0.w = 1; r1.z = dot(cb2[10].xyzw, r0.xyzw); r1.w = -70000 + r1.z; r1.w = max(0, r1.w); r1.w = 9.99999975e-005 * r1.w; r1.w = min(1, r1.w); o0.z = r1.w * 0.5 + r1.z; r1.x = dot(cb2[8].xyzw, r0.xyzw); r1.y = dot(cb2[9].xyzw, r0.xyzw); o0.xy = r1.xy; r1.x = dot(r1.xyz, r1.xyz); r1.x = sqrt(r1.x); r1.x = saturate(r1.x * cb1[0].y + -cb1[0].x); r1.x = log2(r1.x); r1.x = cb1[5].w * r1.x; r1.x = exp2(r1.x); r1.x = min(cb1[2].w, r1.x); r1.y = dot(cb2[11].xyzw, r0.xyzw); o0.w = r1.y; o4.z = r1.y; r1.yzw = cb1[2].xyz + -cb1[1].xyz; o1.xyz = r1.xxx * r1.yzw + cb1[1].xyz; o1.w = r1.x; r1.z = dot(cb2[2].xyzw, r0.xyzw); r1.x = dot(cb2[0].xyzw, r0.xyzw); r1.y = dot(cb2[1].xyzw, r0.xyzw); o5.xyzw = r0.xyzw; r0.x = dot(r1.xyz, r1.xyz); o2.xyz = r1.xyz; r0.yz = cb0[0].xy + r1.xy; o2.w = sqrt(r0.x); r1.zw = r0.yz / cb1[5].zz; r0.xyzw = r0.yzyz / cb1[5].xxyy; r1.xy = r0.zw; r2.xyz = float3(0.00100000005,0.00100000005,0.00100000005) * cb1[5].xyz; r3.zw = v1.xy / r2.zz; r2.xyzw = v1.xyxy / r2.xxyy; r3.xy = r2.zw; r0.z = cmp(0 != cb2[12].x); r1.xyzw = r0.zzzz ? r3.xyzw : r1.xyzw; r0.xy = r0.zz ? r2.xy : r0.xy; o3.xy = cb1[3].xy + r0.xy; o3.zw = cb1[3].zw + r1.xy; o4.xy = cb1[4].xy + r1.zw; o4.w = 0; return; } [/code] I don't know if I can fix it in the vertex shader directly or if it needs to be done in the pixel shader (like the refraction fix). Here is where I officially call for help :(. Edit: an extra water shader for the "ShaderFixes" folder: https://www.dropbox.com/s/mxiaw8w82v89rd8/b316c3fb37c1f863-ps_replace.txt?dl=0
zig11727 said:
Rise of the Tombraider (Steam Version) and Dues EX have a DX12 option.


I know, but they also have a DX11 mode, so a DX12 tool for 3D fixes isn't needed (I mean, that having the need may push people to do something about it).


About the remaining water problem (most noticeable when you look from above), I'm stuck. Here is an example:

How it should be:

Image

How it looks:

Image


Shader example (all of the water shaders are almost the same. 34defe3d2db150e2-ps_replace.txt, without the ASM code to make it shorter here):

//Water PS 9.
// ---- Created with 3Dmigoto v1.2.45 on Sat Oct 29 17:59:54 2016
Texture2D<float4> t11 : register(t11);

Texture2D<float4> t10 : register(t10);

Texture2D<float4> t9 : register(t9);

Texture2D<float4> t8 : register(t8);

Texture2D<float4> t7 : register(t7);

Texture2D<float4> t6 : register(t6);

Texture2D<float4> t5 : register(t5);

Texture2D<float4> t4 : register(t4);

TextureCube<float4> t3 : register(t3);

Texture2D<float4> t1 : register(t1);

SamplerState s11_s : register(s11);

SamplerState s10_s : register(s10);

SamplerState s9_s : register(s9);

SamplerState s8_s : register(s8);

SamplerState s6_s : register(s6);

SamplerState s5_s : register(s5);

SamplerState s4_s : register(s4);

SamplerState s3_s : register(s3);

SamplerState s1_s : register(s1);

cbuffer cb2 : register(b2)
{
float4 cb2[6];
}

cbuffer cb1 : register(b1)
{
float4 cb1[14];
}

cbuffer cb0 : register(b0)
{
float4 cb0[5];
}

cbuffer cb12 : register(b12)
{
float4 cb12[45];
}




// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
float4 v0 : SV_POSITION0,
float4 v1 : COLOR0,
float4 v2 : TEXCOORD0,
float4 v3 : TEXCOORD1,
float4 v4 : TEXCOORD2,
float4 v5 : TEXCOORD3,
nointerpolation float4 v6 : TEXCOORD4,
float4 v7 : TEXCOORD5,
out float4 o0 : SV_Target0)
{
float4 r0,r1,r2,r3,r4,r5,r6,r7,r8,r9;
uint4 bitmask, uiDest;
float4 fDest;

float4 stereo = StereoParams.Load(0);
float separation = stereo.x;
float convergence = stereo.y;

r0.yw = float2(0,0);
r1.xy = float2(64,128) * v6.xx;
r2.w = 1 / r1.y;
r1.xy = v4.zw * r1.xx;
r1.xy = frac(r1.xy);
r1.xy = r1.xy * float2(2,2) + float2(-1,-1);
r1.xy = float2(-0.5,-0.5) + abs(r1.xy);
r1.xy = float2(0.5,0.5) + -r1.xy;
r2.yz = float2(0,0);
r3.xyzw = v4.zwzw + r2.wzzw;
r1.zw = v4.zw + r2.ww;
r4.xyzw = t8.Sample(s8_s, r1.zw).xyzw;
r5.xyzw = t8.Sample(s8_s, r3.zw).xyzw;
r3.xyzw = t8.Sample(s8_s, r3.xy).xyzw;
r1.z = 0.00100000005 * cb1[2].w;
r1.w = r1.z * r5.w;
r0.z = 10.6400003 * r1.w;
r6.xy = r5.xy * float2(2,2) + float2(-1,-1);
r6.z = -r6.y;
r1.w = 1.00999999 + -cb1[4].y;
r1.w = sqrt(r1.w);
r2.zw = v5.xy * r1.ww;
r2.zw = float2(64,64) * r2.zw;
r5.x = dot(r6.xz, r2.zw);
r5.y = dot(r6.yx, r2.zw);
r0.zw = r5.xy + -r0.zw;
r0.zw = float2(0.270000011,0.270000011) + r0.zw;
r0.zw = t9.Sample(s9_s, r0.zw).xy;
r1.w = r1.z * r4.w;
r5.x = 9.92000008 * r1.w;
r5.y = 0;
r6.xy = r4.xy * float2(2,2) + float2(-1,-1);
r6.z = -r6.y;
r4.x = dot(r6.xz, r2.zw);
r4.y = dot(r6.yx, r2.zw);
r4.xy = r4.xy + -r5.xy;
r4.xy = t9.Sample(s9_s, r4.xy).xy;
r5.xy = float2(1,1) + -r1.xy;
r4.xy = r5.xx * r4.xy;
r0.zw = r1.xx * r0.zw + r4.xy;
r0.zw = r5.yy * r0.zw;
r6.xyzw = t8.Sample(s8_s, v4.zw).xyzw;
r1.w = r6.w * r1.z;
r1.z = r1.z * r3.w;
r0.x = 8.47999954 * r1.z;
r2.x = 8 * r1.w;
r7.xy = r6.xy * float2(2,2) + float2(-1,-1);
r7.z = -r7.y;
r4.x = dot(r7.xz, r2.zw);
r4.y = dot(r7.yx, r2.zw);
r1.zw = r4.xy + -r2.xy;
r1.zw = t9.Sample(s9_s, r1.zw).xy;
r7.xy = r3.xy * float2(2,2) + float2(-1,-1);
r2.x = r5.x * r3.z;
r2.x = r1.x * r6.z + r2.x;
r7.z = -r7.y;
r3.x = dot(r7.xz, r2.zw);
r3.y = dot(r7.yx, r2.zw);
r0.xy = r3.xy + -r0.xy;
r0.xy = float2(0.620000005,0.620000005) + r0.xy;
r0.xy = t9.Sample(s9_s, r0.xy).xy;
r0.xy = r5.xx * r0.xy;
r0.xy = r1.xx * r1.zw + r0.xy;
r0.xy = r1.yy * r0.xy + r0.zw;
r0.xy = float2(-0.5,-0.5) + r0.xy;
r0.zw = r5.xy * r5.xy;
r0.zw = r1.xy * r1.xy + r0.zw;
r0.zw = sqrt(r0.zw);
r0.z = r0.w * r0.z;
r0.xy = r0.xy / r0.zz;
r3.zw = float2(0,0);
r0.zw = cb12[44].xy * v0.xy;
r1.zw = cb12[43].xy * r0.zw;
r3.xy = (int2)r1.zw;
r1.z = t7.Load(r3.xyz).x;
r1.z = -r1.z * cb0[2].z + cb0[2].x;
r3.z = cb0[2].w / r1.z;
r6.xy = r0.zw * cb0[0].xy + cb0[0].zw;
r1.zw = r6.xy * float2(2,2) + float2(-1,-1);
r1.zw = r1.zw * r3.zz;
r3.xy = r1.zw / cb2[5].xy;
r1.z = dot(r3.xyz, r3.xyz);
r1.z = sqrt(r1.z);
r1.w = dot(v2.xyz, v2.xyz);
r1.w = rsqrt(r1.w);
r2.yzw = v2.xyz * r1.www;
r3.xyz = -r2.yzw * r1.zzz;
r1.z = dot(r3.xyz, cb2[4].xyz);
r1.w = dot(r3.xyz, r3.xyz);
r1.w = sqrt(r1.w);
r3.x = cb2[4].w / r1.z;
r3.x = 1 + -r3.x;
r1.z = r3.x * abs(r1.z);
r1.w = r3.x * r1.w;
r3.xyzw = saturate(r1.wwzz / cb1[10].zzzz);
r7.xyzw = float4(-1,-1,-1,-1) + r3.xyzw;
r7.xyzw = cb1[11].xyzw * r7.xyzw + float4(1,1,1,1);
r1.z = max(0.400000006, r7.z);
r8.xy = r1.zz * r0.xy;
r0.x = -r8.x * r8.x + 1;
r0.x = -r8.y * r8.y + r0.x;
r8.z = sqrt(r0.x);
r3.xzw = t5.Sample(s5_s, v3.zw).xyz;
r3.xzw = r3.xzw * float3(2,2,2) + float3(-1,-1,-1);
r4.xyw = t4.Sample(s4_s, v3.xy).xyz;
r9.xyz = r4.xyw * float3(2,2,2) + float3(-1,-1,-2);
r4.xyw = r4.xyw * float3(2,2,2) + float3(-1,-1,-1);
r9.xyz = cb1[6].xxx * r9.xyz + float3(0,0,1);
r3.xzw = cb1[6].yyy * r3.xzw + r9.xyz;
r9.xyz = t6.Sample(s6_s, v4.xy).xyz;
r9.xyz = r9.xyz * float3(2,2,2) + float3(-1,-1,-1);
r3.xzw = cb1[6].zzz * r9.xyz + r3.xzw;
r0.x = dot(r3.xzw, r3.xzw);
r0.x = rsqrt(r0.x);
r3.xzw = r3.xzw * r0.xxx + float3(-0,-0,-1);
r3.xzw = r7.zzz * r3.xzw + float3(0,0,1);
r0.x = dot(r3.xzw, r3.xzw);
r0.x = rsqrt(r0.x);
r8.xyz = -r3.xzw * r0.xxx + r8.xyz;
r3.xzw = r3.xzw * r0.xxx;
r0.x = r5.x * r4.z;
r0.x = r1.x * r5.z + r0.x;
r0.x = r5.y * r0.x;
r0.x = r1.y * r2.x + r0.x;
r1.xyz = r0.xxx * r8.xyz + r3.xzw;
r0.x = dot(r1.xyz, r1.xyz);
r0.x = rsqrt(r0.x);
r1.xyz = r1.xyz * r0.xxx + -r4.xyw;
r0.x = -8192 + v2.w;
r0.y = -8192 + cb1[7].x;
r0.x = r0.x / r0.y;
r0.y = 1 + -cb12[42].w;
r0.x = saturate(r0.x * r0.y + cb12[42].w);
r1.xyz = r0.xxx * r1.xyz + r4.xyw;
r0.y = dot(r1.xyz, r1.xyz);
r0.y = rsqrt(r0.y);
r1.xyz = r1.xyz * r0.yyy;
r0.y = cb1[5].w * r7.y;
r4.xy = r0.yy * r1.xy + v7.xy;
r4.z = v7.z;
r4.w = 1;
r0.y = dot(cb2[1].xyzw, r4.xyzw);
r5.z = dot(cb2[3].xyzw, r4.xyzw);
r5.x = dot(cb2[0].xyzw, r4.xyzw);
r5.x+=separation*(r5.z-convergence)*0.5;
r5.y = r5.z + -r0.y;
r3.xz = r5.xy / r5.zz;
r4.xy = cb0[0].zw + r3.xz;
r3.xz = r3.xz / cb0[0].xy;
r3.xz = cb12[43].xy * r3.xz;
r8.xy = (int2)r3.xz;
r3.xz = r4.xy * float2(2,2) + float2(-1,-1);
r8.zw = float2(0,0);
r0.y = t7.Load(r8.xyz).x;
r0.y = -r0.y * cb0[2].z + cb0[2].x;
r4.z = cb0[2].w / r0.y;
r3.xz = r4.zz * r3.xz;
r4.xy = r3.xz / cb2[5].xy;
r0.y = dot(r4.xyz, r4.xyz);
r0.y = sqrt(r0.y);
r3.xzw = -r2.yzw * r0.yyy;
r0.y = dot(r3.xzw, cb2[4].xyz);
r1.w = cmp(0 < r0.y);
r2.x = cmp(r0.y < 0);
r0.y = cb2[4].w / r0.y;
r0.y = 1 + -r0.y;
r1.w = (int)-r1.w + (int)r2.x;
r1.w = (int)r1.w;
r0.y = r1.w * r0.y;
r0.y = cmp(r0.y < 0);
r6.z = 1;
r3.xzw = r0.yyy ? r6.xyz : r5.xyz;
r3.xz = r3.xz / r3.ww;
r3.xz = cb12[43].xy * r3.xz;
r3.xz = max(float2(0,0), r3.xz);
r4.x = cb12[44].z;
r4.y = cb12[43].y;
r3.xz = min(r4.xy, r3.xz);
r3.xzw = t1.Sample(s1_s, r3.xz).xyz;
r5.xyz = cb1[1].xyz + -cb1[0].xyz;
r5.xyz = r3.yyy * r5.xyz + cb1[0].xyz;
r0.y = -r3.y * cb1[10].z + cb1[10].z;
r0.y = saturate(r0.y / cb1[10].w);
r0.y = log2(r0.y);
r0.y = cb1[8].w * r0.y;
r0.y = exp2(r0.y);
r0.y = 1 + -r0.y;
r5.xyz = -r3.xzw * cb1[7].www + r5.xyz;
r3.xyz = cb1[7].www * r3.xzw;
r3.xyz = r0.yyy * r5.xyz + r3.xyz;
r4.zw = cb1[13].xx * r1.xy;
r0.yz = r0.zw * cb1[12].zw + r4.zw;
r0.yz = cb12[43].xy * r0.yz;
r0.yz = max(float2(0,0), r0.yz);
r0.yz = min(r0.yz, r4.xy);
r4.xyzw = t10.Sample(s10_s, r0.yz).xyzw;
r5.xyzw = t11.Sample(s11_s, r0.yz).xyzw;
r4.xyzw = -r5.xyzw + r4.xyzw;
r4.xyzw = cb1[12].yyyy * r4.xyzw + r5.xyzw;
r5.x = 0;
r5.z = 1 + -cb1[7].y;
r0.yzw = cb1[7].yyy * r1.xyz + r5.xxz;
r1.w = dot(r2.yzw, r0.yzw);
r1.w = r1.w + r1.w;
r0.yzw = r0.yzw * -r1.www + r2.yzw;
r0.yzw = t3.Sample(s3_s, r0.yzw).xyz;
r4.xyz = -r0.yzw * cb1[7].www + r4.xyz;
r0.yzw = cb1[7].www * r0.yzw;
r1.w = cb1[12].x * r0.x;
r1.w = saturate(r4.w * r1.w);
r0.yzw = r1.www * r4.xyz + r0.yzw;
r0.yzw = -cb1[2].xyz + r0.yzw;
r0.yzw = cb1[5].yyy * r0.yzw + cb1[2].xyz;
r0.yzw = r0.yzw + -r3.xyz;
r1.w = saturate(dot(-r2.yzw, r1.xyz));
r1.w = 1 + -r1.w;
r2.x = r1.w * r1.w;
r2.x = r2.x * r2.x;
r1.w = r2.x * r1.w;
r2.x = 1 + -cb1[3].x;
r1.w = r2.x * r1.w + cb1[3].x;
r1.w = r1.w * r7.x + -1;
r0.x = r0.x * r1.w + 1;
r0.xyz = r0.xxx * r0.yzw + r3.xyz;
r0.w = dot(r2.yzw, r1.xyz);
r0.w = r0.w + r0.w;
r2.xyz = r1.xyz * -r0.www + r2.yzw;
r0.w = saturate(dot(r1.xyz, float3(-0.0989999995,-0.0989999995,0.99000001)));
r0.w = log2(r0.w);
r0.w = cb1[0].w * r0.w;
r0.w = exp2(r0.w);
r1.x = saturate(dot(r2.xyz, cb0[3].xyz));
r1.x = log2(r1.x);
r1.x = cb1[5].x * r1.x;
r1.x = exp2(r1.x);
r1.yzw = cb0[4].xyz * cb0[3].www;
r2.xyz = r1.xxx * r1.yzw;
r1.xyz = r1.yzw * r0.www;
r1.xyz = cb1[7].zzz * r1.xyz;
r1.xyz = r2.xyz * cb1[1].www + r1.xyz;
r0.xyz = r1.xyz * r7.www + r0.xyz;
r1.xyz = v1.xyz + -r0.xyz;
r0.xyz = v1.www * r1.xyz + r0.xyz;
r0.w = cb0[1].w;
o0.xyz = saturate(r0.xyz * r0.www);
o0.w = saturate(0);
return;
}



The "r5.x+=separation*(r5.z-convergence)*0.5;" correction is for water refraction. I think that the "r1.w = dot(v2.xyz, v2.xyz);" line is what I have to fix. "v2" comes from "o2" in the vertex shader (I picked a random water vertex shader here):

//Water VS 4.
// ---- Created with 3Dmigoto v1.2.45 on Sat Oct 29 12:27:52 2016
cbuffer cb2 : register(b2)
{
float4 cb2[13];
}

cbuffer cb1 : register(b1)
{
float4 cb1[6];
}

cbuffer cb0 : register(b0)
{
float4 cb0[1];
}




// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
float4 v0 : POSITION0,
float2 v1 : TEXCOORD0,
out float4 o0 : SV_POSITION0,
out float4 o1 : COLOR0,
out float4 o2 : TEXCOORD0,
out float4 o3 : TEXCOORD1,
out float4 o4 : TEXCOORD2,
out float4 o5 : TEXCOORD5)
{
float4 r0,r1,r2,r3;
uint4 bitmask, uiDest;
float4 fDest;

float4 stereo = StereoParams.Load(0);
float separation = stereo.x;
float convergence = stereo.y;

r0.xyz = v0.xyz;
r0.w = 1;
r1.z = dot(cb2[10].xyzw, r0.xyzw);
r1.w = -70000 + r1.z;
r1.w = max(0, r1.w);
r1.w = 9.99999975e-005 * r1.w;
r1.w = min(1, r1.w);
o0.z = r1.w * 0.5 + r1.z;
r1.x = dot(cb2[8].xyzw, r0.xyzw);
r1.y = dot(cb2[9].xyzw, r0.xyzw);
o0.xy = r1.xy;
r1.x = dot(r1.xyz, r1.xyz);
r1.x = sqrt(r1.x);
r1.x = saturate(r1.x * cb1[0].y + -cb1[0].x);
r1.x = log2(r1.x);
r1.x = cb1[5].w * r1.x;
r1.x = exp2(r1.x);
r1.x = min(cb1[2].w, r1.x);
r1.y = dot(cb2[11].xyzw, r0.xyzw);
o0.w = r1.y;
o4.z = r1.y;
r1.yzw = cb1[2].xyz + -cb1[1].xyz;
o1.xyz = r1.xxx * r1.yzw + cb1[1].xyz;
o1.w = r1.x;
r1.z = dot(cb2[2].xyzw, r0.xyzw);
r1.x = dot(cb2[0].xyzw, r0.xyzw);
r1.y = dot(cb2[1].xyzw, r0.xyzw);
o5.xyzw = r0.xyzw;
r0.x = dot(r1.xyz, r1.xyz);
o2.xyz = r1.xyz;
r0.yz = cb0[0].xy + r1.xy;
o2.w = sqrt(r0.x);
r1.zw = r0.yz / cb1[5].zz;
r0.xyzw = r0.yzyz / cb1[5].xxyy;
r1.xy = r0.zw;
r2.xyz = float3(0.00100000005,0.00100000005,0.00100000005) * cb1[5].xyz;
r3.zw = v1.xy / r2.zz;
r2.xyzw = v1.xyxy / r2.xxyy;
r3.xy = r2.zw;
r0.z = cmp(0 != cb2[12].x);
r1.xyzw = r0.zzzz ? r3.xyzw : r1.xyzw;
r0.xy = r0.zz ? r2.xy : r0.xy;
o3.xy = cb1[3].xy + r0.xy;
o3.zw = cb1[3].zw + r1.xy;
o4.xy = cb1[4].xy + r1.zw;
o4.w = 0;
return;
}



I don't know if I can fix it in the vertex shader directly or if it needs to be done in the pixel shader (like the refraction fix).

Here is where I officially call for help :(.

Edit: an extra water shader for the "ShaderFixes" folder: https://www.dropbox.com/s/mxiaw8w82v89rd8/b316c3fb37c1f863-ps_replace.txt?dl=0

CPU: Intel Core i7 7700K @ 4.9GHz
Motherboard: Gigabyte Aorus GA-Z270X-Gaming 5
RAM: GSKILL Ripjaws Z 16GB 3866MHz CL18
GPU: MSI GeForce RTX 2080Ti Gaming X Trio
Monitor: Asus PG278QR
Speakers: Logitech Z506
Donations account: masterotakusuko@gmail.com

#61
Posted 10/30/2016 11:28 AM   
Good job on the fix masterotaku.
Good job on the fix masterotaku.

Intel Core i7-3820, 4 X 3,60 GHz overclocked to 4,50 GHz ; EVGA Titan X 12VRAM ; 16 GB Corsair Vengeance DDR-1600 (4x 4 GB) ; Asus VG278H 27-inch incl. 3D vision 2 glasses, integrated transmitter ; Xbox One Elite wireless controller ; Windows 10HTC VIVE 2,5 m2 roomscale3D VISION GAMERS - VISIT ME ON STEAM and feel free to add me: http://steamcommunity.com/profiles/76561198064106555 YOUTUBE: https://www.youtube.com/channel/UC1UE5TPoF0HX0HVpF_E4uPQ STEAM CURATOR: https://store.steampowered.com/curator/33611530-Streaming-Deluxe/ Image

#62
Posted 10/30/2016 11:33 AM   
For further reference, here is a water pixel shader from the original Skyrim (C16C446E.txt): [code] // HeliX water shader fix // Generated by Microsoft (R) HLSL Shader Compiler 9.27.952.3022 // // Parameters: // // float4 CameraData; // samplerCUBE CubeMapSampler; // float4 DeepColor; // float4 DepthControl; // sampler2D DepthSampler; // sampler2D DisplacementSampler; // float4 FogNearColor; // float4 FogParam; // float4 FresnelRI; // sampler2D Normals01Sampler; // sampler2D Normals02Sampler; // sampler2D Normals03Sampler; // float4 NormalsAmplitude; // float4 PosAdjust; // float2 ProjData; // float4 ReflectPlane; // float3 ReflectionColor; // sampler2D RefractionSampler; // float4 ShallowColor; // row_major float4x4 TextureProj; // float4 VPOSOffset; // float4 VarAmounts; // float4 WaterParams; // // // Registers: // // Name Reg Size // ------------------- ----- ---- // TextureProj c0 4 // ShallowColor c4 1 // DeepColor c5 1 // ReflectionColor c6 1 // FresnelRI c7 1 // PosAdjust c8 1 // ReflectPlane c9 1 // CameraData c10 1 // ProjData c11 1 // VarAmounts c12 1 // NormalsAmplitude c13 1 // WaterParams c14 1 // FogParam c15 1 // DepthControl c16 1 // FogNearColor c17 1 // VPOSOffset c18 1 // RefractionSampler s0 1 // DisplacementSampler s1 1 // DepthSampler s2 1 // CubeMapSampler s3 1 // Normals01Sampler s4 1 // Normals02Sampler s5 1 // Normals03Sampler s6 1 // ps_3_0 def c19, -8192, 2, -1, 1 def c20, 1, 0, -0, -1 def c21, -0.5, 0.0399999991, 0, 0 def c22, 2, -1, -2, -0 def c200, 0.2, 90.0, 0.0625, 0.5 dcl_texcoord v0 dcl_texcoord1 v1 dcl_texcoord2 v2.xy dcl_texcoord3 v3.xy dcl_texcoord4 v4.xyz dcl_color1 v5 dcl_texcoord5 v6 dcl vPos.xy dcl_2d s0 dcl_2d s1 dcl_2d s2 dcl_cube s3 dcl_2d s4 dcl_2d s5 dcl_2d s6 dcl_2d s13 texld r0, v2, s6 mad r0.xyz, r0, c19.y, c19.z mul r0.xyz, r0, c13.z texld r1, v1, s4 mad r1.xyz, r1, c22.x, c22.yyzw mov r2.yw, c22 mad r1.xyz, c13.x, r1, -r2.wwyw texld r2, v1.zwzw, s5 mad r2.xyz, r2, c19.y, c19.z mul r2.xyz, r2, c13.y mov r3.xw, c19 add r0.w, r3.x, c14.x rcp r0.w, r0.w add r1.w, c19.x, v0.w mul_sat r0.w, r0.w, r1.w mad r1.xyz, r2, r0.w, r1 mad r0.xyz, r0, r0.w, r1 dp3 r1.x, r0, r0 rsq r1.x, r1.x mad r0.xyz, r0, r1.x, c22.wwyw mad r1.xy, vPos, c18, c18.zwzw rcp r11.w, v6.w mul r11.xy, v6.xy, r11.w texld r2, r1, s2 mad r1.xy, r11, c19.y, c19.z mad r1.z, r2.x, -c10.z, c10.x rcp r1.z, r1.z mul r2.z, r1.z, c10.w mul r1.xy, r1, r2.z rcp r3.x, c11.x rcp r3.y, c11.y mul r2.xy, r1, r3 dp3 r1.x, r2, r2 rsq r1.x, r1.x rcp r1.x, r1.x nrm r2.xyz, v0 mul r1.xyz, r1.x, -r2 dp3 r1.w, r1, c9 dp3 r1.x, r1, r1 rsq r1.x, r1.x rcp r1.x, r1.x rcp r1.y, r1.w mad r1.y, c9.w, -r1.y, r3.w mul r1.z, r1_abs.w, r1.y mul r1.x, r1.x, r1.y rcp r1.y, c15.z mul_sat r3.xyz, r1.y, r1.xxzw add r1.xyz, r3, c19.z mad r1.xyz, c16, r1, r3.w mad r0.xyz, r1.z, r0, -c22.wwyw texld r4, v3, s1 add r1.zw, r4, c21.x mul r4.xy, r1.zwzw, c13.w mov r4.z, c21.y dp3 r1.z, r4, r4 rsq r1.z, r1.z mad r0.xyz, r4, -r1.z, r0 mul r4.xyz, r1.z, r4 mad r0.xyz, r4.z, r0, r4 nrm r4.xyz, r0 mul r0.x, r1.y, c12.w mad r5.xy, r0.x, r4, v4 mad r5.zw, v4.z, c20.xyxy, c20.xyzx dp4 r0.x, c1, r5 dp4 r6.w, c3, r5 add r6.y, -r0.x, r6.w dp4 r6.x, c0, r5 dp4 r6.z, c2, r5 texldl r11, c200.z, s13 add r11.y, r6.w, -r11.y mul r11.x, r11.x, r11.y mul r11.x, r11.x, c200.w add r6.x, r6.x, r11.x texldp r5, r6, s0 mov r0.xyz, c4 add r0.xyz, -r0, c5 mad r0.xyz, r3.y, r0, c4 mad_pp r1.y, r3.y, -c15.z, c15.z mad r0.xyz, r5, -c14.w, r0 mul_pp r3.xyz, r5, c14.w rcp r1.z, c15.w mul_sat_pp r1.y, r1.z, r1.y pow r2.w, r1.y, c17.w add r1.y, -r2.w, c19.w mad_pp r0.xyz, r1.y, r0, r3 dp3_sat r1.y, -r2, r4 add r1.y, -r1.y, c19.w mul r1.z, r1.y, r1.y mul r1.z, r1.z, r1.z mul r1.y, r1.z, r1.y lrp r2.w, r1.y, r3.w, c7.x mad r1.x, r2.w, r1.x, c19.z mad r0.w, r0.w, r1.x, c19.w mov r1.yw, c14 mad r1.xyz, r1.y, c20.yyww, c20.zzxw mad r1.xyz, c14.y, r4, r1 dp3 r2.w, r2, r1 add r2.w, r2.w, r2.w mad r1.xyz, r1, -r2.w, r2 texld r2, r1, s3 mad r1.xyz, r2, r1.w, -c6 mov r2.xyz, c6 mad_pp r1.xyz, c12.y, r1, r2 lrp r2.xyz, r0.w, r1, r0 lrp r0.xyz, v5.w, v5, r2 mul oC0.xyz, r0, c8.w mov oC0.w, c19.w // approximately 106 instruction slots used (7 texture, 99 arithmetic) [/code] In line 153, it does the refraction fix, I think. But I'm not sure what line 104 does.
For further reference, here is a water pixel shader from the original Skyrim (C16C446E.txt):

// HeliX water shader fix
// Generated by Microsoft (R) HLSL Shader Compiler 9.27.952.3022
//
// Parameters:
//
// float4 CameraData;
// samplerCUBE CubeMapSampler;
// float4 DeepColor;
// float4 DepthControl;
// sampler2D DepthSampler;
// sampler2D DisplacementSampler;
// float4 FogNearColor;
// float4 FogParam;
// float4 FresnelRI;
// sampler2D Normals01Sampler;
// sampler2D Normals02Sampler;
// sampler2D Normals03Sampler;
// float4 NormalsAmplitude;
// float4 PosAdjust;
// float2 ProjData;
// float4 ReflectPlane;
// float3 ReflectionColor;
// sampler2D RefractionSampler;
// float4 ShallowColor;
// row_major float4x4 TextureProj;
// float4 VPOSOffset;
// float4 VarAmounts;
// float4 WaterParams;
//
//
// Registers:
//
// Name Reg Size
// ------------------- ----- ----
// TextureProj c0 4
// ShallowColor c4 1
// DeepColor c5 1
// ReflectionColor c6 1
// FresnelRI c7 1
// PosAdjust c8 1
// ReflectPlane c9 1
// CameraData c10 1
// ProjData c11 1
// VarAmounts c12 1
// NormalsAmplitude c13 1
// WaterParams c14 1
// FogParam c15 1
// DepthControl c16 1
// FogNearColor c17 1
// VPOSOffset c18 1
// RefractionSampler s0 1
// DisplacementSampler s1 1
// DepthSampler s2 1
// CubeMapSampler s3 1
// Normals01Sampler s4 1
// Normals02Sampler s5 1
// Normals03Sampler s6 1
//

ps_3_0
def c19, -8192, 2, -1, 1
def c20, 1, 0, -0, -1
def c21, -0.5, 0.0399999991, 0, 0
def c22, 2, -1, -2, -0
def c200, 0.2, 90.0, 0.0625, 0.5
dcl_texcoord v0
dcl_texcoord1 v1
dcl_texcoord2 v2.xy
dcl_texcoord3 v3.xy
dcl_texcoord4 v4.xyz
dcl_color1 v5
dcl_texcoord5 v6
dcl vPos.xy
dcl_2d s0
dcl_2d s1
dcl_2d s2
dcl_cube s3
dcl_2d s4
dcl_2d s5
dcl_2d s6
dcl_2d s13
texld r0, v2, s6
mad r0.xyz, r0, c19.y, c19.z
mul r0.xyz, r0, c13.z
texld r1, v1, s4
mad r1.xyz, r1, c22.x, c22.yyzw
mov r2.yw, c22
mad r1.xyz, c13.x, r1, -r2.wwyw
texld r2, v1.zwzw, s5
mad r2.xyz, r2, c19.y, c19.z
mul r2.xyz, r2, c13.y
mov r3.xw, c19
add r0.w, r3.x, c14.x
rcp r0.w, r0.w
add r1.w, c19.x, v0.w
mul_sat r0.w, r0.w, r1.w
mad r1.xyz, r2, r0.w, r1
mad r0.xyz, r0, r0.w, r1
dp3 r1.x, r0, r0
rsq r1.x, r1.x
mad r0.xyz, r0, r1.x, c22.wwyw
mad r1.xy, vPos, c18, c18.zwzw

rcp r11.w, v6.w
mul r11.xy, v6.xy, r11.w

texld r2, r1, s2
mad r1.xy, r11, c19.y, c19.z
mad r1.z, r2.x, -c10.z, c10.x
rcp r1.z, r1.z
mul r2.z, r1.z, c10.w
mul r1.xy, r1, r2.z
rcp r3.x, c11.x
rcp r3.y, c11.y
mul r2.xy, r1, r3
dp3 r1.x, r2, r2
rsq r1.x, r1.x
rcp r1.x, r1.x
nrm r2.xyz, v0
mul r1.xyz, r1.x, -r2
dp3 r1.w, r1, c9
dp3 r1.x, r1, r1
rsq r1.x, r1.x
rcp r1.x, r1.x
rcp r1.y, r1.w
mad r1.y, c9.w, -r1.y, r3.w
mul r1.z, r1_abs.w, r1.y
mul r1.x, r1.x, r1.y
rcp r1.y, c15.z
mul_sat r3.xyz, r1.y, r1.xxzw
add r1.xyz, r3, c19.z
mad r1.xyz, c16, r1, r3.w
mad r0.xyz, r1.z, r0, -c22.wwyw
texld r4, v3, s1
add r1.zw, r4, c21.x
mul r4.xy, r1.zwzw, c13.w
mov r4.z, c21.y
dp3 r1.z, r4, r4
rsq r1.z, r1.z
mad r0.xyz, r4, -r1.z, r0
mul r4.xyz, r1.z, r4
mad r0.xyz, r4.z, r0, r4
nrm r4.xyz, r0
mul r0.x, r1.y, c12.w
mad r5.xy, r0.x, r4, v4
mad r5.zw, v4.z, c20.xyxy, c20.xyzx
dp4 r0.x, c1, r5
dp4 r6.w, c3, r5
add r6.y, -r0.x, r6.w
dp4 r6.x, c0, r5
dp4 r6.z, c2, r5

texldl r11, c200.z, s13
add r11.y, r6.w, -r11.y
mul r11.x, r11.x, r11.y
mul r11.x, r11.x, c200.w
add r6.x, r6.x, r11.x

texldp r5, r6, s0
mov r0.xyz, c4
add r0.xyz, -r0, c5
mad r0.xyz, r3.y, r0, c4
mad_pp r1.y, r3.y, -c15.z, c15.z
mad r0.xyz, r5, -c14.w, r0
mul_pp r3.xyz, r5, c14.w
rcp r1.z, c15.w
mul_sat_pp r1.y, r1.z, r1.y
pow r2.w, r1.y, c17.w
add r1.y, -r2.w, c19.w
mad_pp r0.xyz, r1.y, r0, r3
dp3_sat r1.y, -r2, r4
add r1.y, -r1.y, c19.w
mul r1.z, r1.y, r1.y
mul r1.z, r1.z, r1.z
mul r1.y, r1.z, r1.y
lrp r2.w, r1.y, r3.w, c7.x
mad r1.x, r2.w, r1.x, c19.z
mad r0.w, r0.w, r1.x, c19.w
mov r1.yw, c14
mad r1.xyz, r1.y, c20.yyww, c20.zzxw
mad r1.xyz, c14.y, r4, r1
dp3 r2.w, r2, r1
add r2.w, r2.w, r2.w
mad r1.xyz, r1, -r2.w, r2
texld r2, r1, s3
mad r1.xyz, r2, r1.w, -c6
mov r2.xyz, c6
mad_pp r1.xyz, c12.y, r1, r2
lrp r2.xyz, r0.w, r1, r0
lrp r0.xyz, v5.w, v5, r2
mul oC0.xyz, r0, c8.w
mov oC0.w, c19.w

// approximately 106 instruction slots used (7 texture, 99 arithmetic)


In line 153, it does the refraction fix, I think. But I'm not sure what line 104 does.

CPU: Intel Core i7 7700K @ 4.9GHz
Motherboard: Gigabyte Aorus GA-Z270X-Gaming 5
RAM: GSKILL Ripjaws Z 16GB 3866MHz CL18
GPU: MSI GeForce RTX 2080Ti Gaming X Trio
Monitor: Asus PG278QR
Speakers: Logitech Z506
Donations account: masterotakusuko@gmail.com

#63
Posted 10/30/2016 11:38 AM   
Haven't read through the previous posts, just answering your question in your last one: in Helixmod's ASM there is no divide function, so instead that gets split into 2 separate commands, use rcp to set the reciprocal of the source into the destination register, and then multiply by that to achieve the same result as dividing, which is essentially what lines 104 and 105 is doing: dividing v6.xy by v6.w, and storing the values in r11, which is used later on in the shader.
Haven't read through the previous posts, just answering your question in your last one: in Helixmod's ASM there is no divide function, so instead that gets split into 2 separate commands, use rcp to set the reciprocal of the source into the destination register, and then multiply by that to achieve the same result as dividing, which is essentially what lines 104 and 105 is doing: dividing v6.xy by v6.w, and storing the values in r11, which is used later on in the shader.

3D Gaming Rig: CPU: i7 7700K @ 4.9Ghz | Mobo: Asus Maximus Hero VIII | RAM: Corsair Dominator 16GB | GPU: 2 x GTX 1080 Ti SLI | 3xSSDs for OS and Apps, 2 x HDD's for 11GB storage | PSU: Seasonic X-1250 M2| Case: Corsair C70 | Cooling: Corsair H115i Hydro cooler | Displays: Asus PG278QR, BenQ XL2420TX & BenQ HT1075 | OS: Windows 10 Pro + Windows 7 dual boot

Like my fixes? Dontations can be made to: www.paypal.me/DShanz or rshannonca@gmail.com
Like electronic music? Check out: www.soundcloud.com/dj-ryan-king

#64
Posted 10/30/2016 09:14 PM   
[quote="bo3b"] If people care about modding- then you need to take Betheseda to task for removing the shader headers. Contact them. It provides them zero value, and makes it 10x harder to mod. Removing the shader headers is a strictly anti-modder move.[/quote] I am not actually a fan of this game and probably won't bother with it further, If I want to play a open world fantasy rpg I probably fire up the witcher. And yes that's a bit of a dick move to do that, but that's the only reason why I think it would be worthwhile to fix this is for the modding improvements because as it stands the engine doesn't handle alot of mods very well, and crashes regardless of build order) I don't think many mods where broken by shaders for this game so I don't think its huge on the modding communities radar, apart from us poor 3dvision outcasts.
bo3b said:
If people care about modding- then you need to take Betheseda to task for removing the shader headers. Contact them. It provides them zero value, and makes it 10x harder to mod.

Removing the shader headers is a strictly anti-modder move.


I am not actually a fan of this game and probably won't bother with it further, If I want to play a open world fantasy rpg I probably fire up the witcher. And yes that's a bit of a dick move to do that, but that's the only reason why I think it would be worthwhile to fix this is for the modding improvements because as it stands the engine doesn't handle alot of mods very well, and crashes regardless of build order)

I don't think many mods where broken by shaders for this game so I don't think its huge on the modding communities radar, apart from us poor 3dvision outcasts.

i7-4790K CPU 4.8Ghz stable overclock.
16 GB RAM Corsair
ASUS Turbo 2080TI
Samsung SSD 840Pro
ASUS Z97-WS3D
Surround ASUS Rog Swift PG278Q(R), 2x PG278Q (yes it works)
Obutto R3volution.
Windows 10 pro 64x (Windows 7 Dual boot)

#65
Posted 10/31/2016 03:54 AM   
I honestly don't think I would play Bethesda games if they weren't moddable. Bethesda games + mods = arguably the best games in the world. Bethesda games - mods = competent but sloppy games that don't excel in any area.
I honestly don't think I would play Bethesda games if they weren't moddable.

Bethesda games + mods = arguably the best games in the world.

Bethesda games - mods = competent but sloppy games that don't excel in any area.

ImageVolnaPC.com - Tips, tweaks, performance comparisons (PhysX card, SLI scaling, etc)

#66
Posted 10/31/2016 04:23 AM   
@DJ-RK Thank you. I looked at the microsoft documentation before your post, saw that it was the reciprocate (if they had said "inverse" I would have known what they meant :p). Still, that part of the shader is different from the DX11 version. The effect is at screen depth. My plan is putting it at 100% depth first and then correct ir back. I suspect that the camera FOV may come into play. If someone can do it, please help (I'm at work and won't be home for 10 hours).
@DJ-RK
Thank you. I looked at the microsoft documentation before your post, saw that it was the reciprocate (if they had said "inverse" I would have known what they meant :p).

Still, that part of the shader is different from the DX11 version.

The effect is at screen depth. My plan is putting it at 100% depth first and then correct ir back. I suspect that the camera FOV may come into play. If someone can do it, please help (I'm at work and won't be home for 10 hours).

CPU: Intel Core i7 7700K @ 4.9GHz
Motherboard: Gigabyte Aorus GA-Z270X-Gaming 5
RAM: GSKILL Ripjaws Z 16GB 3866MHz CL18
GPU: MSI GeForce RTX 2080Ti Gaming X Trio
Monitor: Asus PG278QR
Speakers: Logitech Z506
Donations account: masterotakusuko@gmail.com

#67
Posted 10/31/2016 07:44 AM   
[quote="masterotaku"]About the remaining water problem (most noticeable when you look from above), I'm stuck. Here is an example: [...] Shader example (all of the water shaders are almost the same. 34defe3d2db150e2-ps_replace.txt, without the ASM code to make it shorter here): [...] The "r5.x+=separation*(r5.z-convergence)*0.5;" correction is for water refraction. I think that the "r1.w = dot(v2.xyz, v2.xyz);" line is what I have to fix. "v2" comes from "o2" in the vertex shader (I picked a random water vertex shader here): [...] I don't know if I can fix it in the vertex shader directly or if it needs to be done in the pixel shader (like the refraction fix). Here is where I officially call for help :(. [/quote] This is the first time I use 3Dmigoto so I may be wrong. I didn't found that location of your screenshots but I found similar problems with shallow water in other water shaders. For instance, in the water with ice floes in the north (Water PS 3), the output color of the underwater pixels seems to be sampled from a broken texture. So I guess that the problem has to be fixed in another shader. In frame analysis I saw the problem first in some assembler-only shaders (see picture) but I don't know how to modify them yet. 001717-ps-t0=4e5bb4ca-vs=d80566665db3dd02-ps=e192bd2508cda3ee [img]https://forums.geforce.com/cmd/default/download-comment-attachment/70647/[/img]
masterotaku said:About the remaining water problem (most noticeable when you look from above), I'm stuck. Here is an example:

[...]

Shader example (all of the water shaders are almost the same. 34defe3d2db150e2-ps_replace.txt, without the ASM code to make it shorter here):

[...]

The "r5.x+=separation*(r5.z-convergence)*0.5;" correction is for water refraction. I think that the "r1.w = dot(v2.xyz, v2.xyz);" line is what I have to fix. "v2" comes from "o2" in the vertex shader (I picked a random water vertex shader here):

[...]

I don't know if I can fix it in the vertex shader directly or if it needs to be done in the pixel shader (like the refraction fix).

Here is where I officially call for help :(.


This is the first time I use 3Dmigoto so I may be wrong.

I didn't found that location of your screenshots but I found similar problems with shallow water in other water shaders. For instance, in the water with ice floes in the north (Water PS 3), the output color of the underwater pixels seems to be sampled from a broken texture. So I guess that the problem has to be fixed in another shader.

In frame analysis I saw the problem first in some assembler-only shaders (see picture) but I don't know how to modify them yet.

001717-ps-t0=4e5bb4ca-vs=d80566665db3dd02-ps=e192bd2508cda3ee
Image
Thanks for the help. I don't know what else could be causing that. There are basically two types of water shaders: surface and all water itself (for refractions and this I'm touching the surface ones. The others just break the position of water if I alter them). Modifying "o2" in the water surface vertex shaders is what moves the effect. After a few hours of trying things (getting it to be better at certain camera angles or distances but worse at others, for example), I accidentally put water reflections to depth instead of at the surface of water :p. Example of a shader (65dad8a710904ca1-vs_replace.txt. I don't know if this file is present in the current fix I published): [code] //Water VS 8. // ---- Created with 3Dmigoto v1.2.45 on Mon Oct 31 22:11:49 2016 cbuffer cb2 : register(b2) { float4 cb2[14]; } cbuffer cb1 : register(b1) { float4 cb1[6]; } cbuffer cb0 : register(b0) { float4 cb0[1]; } // 3Dmigoto declarations #define cmp - Texture1D<float4> IniParams : register(t120); Texture2D<float4> StereoParams : register(t125); void main( float4 v0 : POSITION0, float2 v1 : TEXCOORD0, out float4 o0 : SV_POSITION0, out float4 o1 : COLOR0, out float4 o2 : TEXCOORD0, out float4 o3 : TEXCOORD1, out float4 o4 : TEXCOORD2, out float4 o5 : TEXCOORD3, out float4 o6 : TEXCOORD4, out float4 o7 : TEXCOORD5) { float4 r0,r1,r20,r21; uint4 bitmask, uiDest; float4 fDest; float4 stereo = StereoParams.Load(0); float4 iniparams = IniParams.Load(0); float separation = stereo.x; float convergence = stereo.y; r0.xyz = v0.xyz; r0.w = 1; r1.z = dot(cb2[10].xyzw, r0.xyzw); r1.w = -70000 + r1.z; r1.w = max(0, r1.w); r1.w = 9.99999975e-005 * r1.w; r1.w = min(1, r1.w); o0.z = r1.w * 0.5 + r1.z; r1.x = dot(cb2[8].xyzw, r0.xyzw); r1.y = dot(cb2[9].xyzw, r0.xyzw); o0.xy = r1.xy; r1.x = dot(r1.xyz, r1.xyz); r1.x = sqrt(r1.x); r1.x = saturate(r1.x * cb1[0].y + -cb1[0].x); r1.x = log2(r1.x); r1.x = cb1[5].w * r1.x; r1.x = exp2(r1.x); r1.x = min(cb1[2].w, r1.x); o0.w = dot(cb2[11].xyzw, r0.xyzw); r1.yzw = cb1[2].xyz + -cb1[1].xyz; o1.xyz = r1.xxx * r1.yzw + cb1[1].xyz; o1.w = r1.x; r1.z = dot(cb2[2].xyzw, r0.xyzw); r1.x = dot(cb2[0].xyzw, r0.xyzw); r1.y = dot(cb2[1].xyzw, r0.xyzw); o7.xyzw = r0.xyzw; r20.xyzw=r0.xyzw; float4 depth; depth=dot(cb2[2].xyzw, r20.xyzw); r20.x-=separation*(depth*convergence*0.01-convergence)*-cb2[10].y*iniparams.y; r21.z = dot(cb2[2].xyzw, r20.xyzw); r21.x = dot(cb2[0].xyzw, r20.xyzw); r21.y = dot(cb2[1].xyzw, r20.xyzw); r20.x = dot(r21.xyz, r21.xyz); r0.x = dot(r1.xyz, r1.xyz); o2.xyz = r21.xyz; r0.yz = cb0[0].xy + r1.xy; o2.w = sqrt(r20.x); r1.xyzw = r0.yzyz / cb1[5].xxyy; r0.xy = r0.yz / cb1[5].zz; o4.xy = cb1[4].xy + r0.xy; o3.xyzw = cb1[3].xyzw + r1.xyzw; r0.xy = float2(-0.5,-0.5) + v1.xy; r0.xy = r0.xy * float2(0.100000001,0.100000001) + cb2[13].xy; r0.z = -cb2[13].w + cb2[12].x; r0.w = r0.z / cb2[12].x; r0.z = cb2[13].z / cb2[12].x; o4.zw = r0.xy + r0.zw; r0.xy = v1.xy * float2(0.5,0.5) + cb2[12].yz; o5.xy = float2(-0.25,-0.25) + r0.xy; o5.zw = v1.xy; o6.x = cb2[12].x; return; } /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Generated by Microsoft (R) D3D Shader Disassembler // // using 3Dmigoto v1.2.45 on Mon Oct 31 22:11:49 2016 // // // Input signature: // // Name Index Mask Register SysValue Format Used // -------------------- ----- ------ -------- -------- ------- ------ // POSITION 0 xyzw 0 NONE float xyz // TEXCOORD 0 xy 1 NONE float xy // // // Output signature: // // Name Index Mask Register SysValue Format Used // -------------------- ----- ------ -------- -------- ------- ------ // SV_POSITION 0 xyzw 0 POS float xyzw // COLOR 0 xyzw 1 NONE float xyzw // TEXCOORD 0 xyzw 2 NONE float xyzw // TEXCOORD 1 xyzw 3 NONE float xyzw // TEXCOORD 2 xyzw 4 NONE float xyzw // TEXCOORD 3 xyzw 5 NONE float xyzw // TEXCOORD 4 x 6 NONE float x // TEXCOORD 5 xyzw 7 NONE float xyzw // vs_5_0 dcl_globalFlags refactoringAllowed dcl_constantbuffer cb0[1], immediateIndexed dcl_constantbuffer cb1[6], immediateIndexed dcl_constantbuffer cb2[14], immediateIndexed dcl_input v0.xyz dcl_input v1.xy dcl_output_siv o0.xyzw, position dcl_output o1.xyzw dcl_output o2.xyzw dcl_output o3.xyzw dcl_output o4.xyzw dcl_output o5.xyzw dcl_output o6.x dcl_output o7.xyzw dcl_temps 2 mov r0.xyz, v0.xyzx mov r0.w, l(1.000000) dp4 r1.z, cb2[10].xyzw, r0.xyzw add r1.w, r1.z, l(-70000.000000) max r1.w, r1.w, l(0.000000) mul r1.w, r1.w, l(0.000100) min r1.w, r1.w, l(1.000000) mad o0.z, r1.w, l(0.500000), r1.z dp4 r1.x, cb2[8].xyzw, r0.xyzw dp4 r1.y, cb2[9].xyzw, r0.xyzw mov o0.xy, r1.xyxx dp3 r1.x, r1.xyzx, r1.xyzx sqrt r1.x, r1.x mad_sat r1.x, r1.x, cb1[0].y, -cb1[0].x log r1.x, r1.x mul r1.x, r1.x, cb1[5].w exp r1.x, r1.x min r1.x, r1.x, cb1[2].w dp4 o0.w, cb2[11].xyzw, r0.xyzw add r1.yzw, -cb1[1].xxyz, cb1[2].xxyz mad o1.xyz, r1.xxxx, r1.yzwy, cb1[1].xyzx mov o1.w, r1.x dp4 r1.z, cb2[2].xyzw, r0.xyzw dp4 r1.x, cb2[0].xyzw, r0.xyzw dp4 r1.y, cb2[1].xyzw, r0.xyzw mov o7.xyzw, r0.xyzw dp3 r0.x, r1.xyzx, r1.xyzx mov o2.xyz, r1.xyzx add r0.yz, r1.xxyx, cb0[0].xxyx sqrt o2.w, r0.x div r1.xyzw, r0.yzyz, cb1[5].xxyy div r0.xy, r0.yzyy, cb1[5].zzzz add o4.xy, r0.xyxx, cb1[4].xyxx add o3.xyzw, r1.xyzw, cb1[3].xyzw add r0.xy, v1.xyxx, l(-0.500000, -0.500000, 0.000000, 0.000000) mad r0.xy, r0.xyxx, l(0.100000, 0.100000, 0.000000, 0.000000), cb2[13].xyxx add r0.z, cb2[12].x, -cb2[13].w div r0.w, r0.z, cb2[12].x div r0.z, cb2[13].z, cb2[12].x add o4.zw, r0.zzzw, r0.xxxy mad r0.xy, v1.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000), cb2[12].yzyy add o5.xy, r0.xyxx, l(-0.250000, -0.250000, 0.000000, 0.000000) mov o5.zw, v1.xxxy mov o6.x, cb2[12].x ret // Approximately 0 instruction slots used ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ [/code] As you see, I copied some calculations to r20 and r21, imitating r0 and r1 but doing a correction at some point: [code]r20.x-=separation*(depth*convergence*0.01-convergence)*-cb2[10].y*iniparams.y;[/code] This is still wrong, by the way. Multiplying by "-cb2[10].y" made reflections be at positive depth at two camera positions. iniparams.y is for the bloom hotkey, but I'm also using it now to toggle this effect quickly. Imagine that I say north, east, south and west, about the camera position as I rotate. Without "-cb2[10].y", it would be: - North: inside of the surface. - East and west: surface level. - South: outside of the surface. With it: - North and south: inside of the surface. - East and west: surface level. The shader is aware of my 360 degree camera position. My current code isn't the best I got for the water opacity problem (which affects those glaciers too). Not knowing what all those constant buffers are is annoying. If I somehow fix the opacity, I wonder how reflections will be in the end.
Thanks for the help. I don't know what else could be causing that. There are basically two types of water shaders: surface and all water itself (for refractions and this I'm touching the surface ones. The others just break the position of water if I alter them). Modifying "o2" in the water surface vertex shaders is what moves the effect. After a few hours of trying things (getting it to be better at certain camera angles or distances but worse at others, for example), I accidentally put water reflections to depth instead of at the surface of water :p.

Example of a shader (65dad8a710904ca1-vs_replace.txt. I don't know if this file is present in the current fix I published):

//Water VS 8.
// ---- Created with 3Dmigoto v1.2.45 on Mon Oct 31 22:11:49 2016
cbuffer cb2 : register(b2)
{
float4 cb2[14];
}

cbuffer cb1 : register(b1)
{
float4 cb1[6];
}

cbuffer cb0 : register(b0)
{
float4 cb0[1];
}




// 3Dmigoto declarations
#define cmp -
Texture1D<float4> IniParams : register(t120);
Texture2D<float4> StereoParams : register(t125);


void main(
float4 v0 : POSITION0,
float2 v1 : TEXCOORD0,
out float4 o0 : SV_POSITION0,
out float4 o1 : COLOR0,
out float4 o2 : TEXCOORD0,
out float4 o3 : TEXCOORD1,
out float4 o4 : TEXCOORD2,
out float4 o5 : TEXCOORD3,
out float4 o6 : TEXCOORD4,
out float4 o7 : TEXCOORD5)
{
float4 r0,r1,r20,r21;
uint4 bitmask, uiDest;
float4 fDest;

float4 stereo = StereoParams.Load(0);
float4 iniparams = IniParams.Load(0);
float separation = stereo.x;
float convergence = stereo.y;

r0.xyz = v0.xyz;
r0.w = 1;
r1.z = dot(cb2[10].xyzw, r0.xyzw);
r1.w = -70000 + r1.z;
r1.w = max(0, r1.w);
r1.w = 9.99999975e-005 * r1.w;
r1.w = min(1, r1.w);
o0.z = r1.w * 0.5 + r1.z;
r1.x = dot(cb2[8].xyzw, r0.xyzw);
r1.y = dot(cb2[9].xyzw, r0.xyzw);
o0.xy = r1.xy;
r1.x = dot(r1.xyz, r1.xyz);
r1.x = sqrt(r1.x);
r1.x = saturate(r1.x * cb1[0].y + -cb1[0].x);
r1.x = log2(r1.x);
r1.x = cb1[5].w * r1.x;
r1.x = exp2(r1.x);
r1.x = min(cb1[2].w, r1.x);
o0.w = dot(cb2[11].xyzw, r0.xyzw);
r1.yzw = cb1[2].xyz + -cb1[1].xyz;
o1.xyz = r1.xxx * r1.yzw + cb1[1].xyz;
o1.w = r1.x;
r1.z = dot(cb2[2].xyzw, r0.xyzw);
r1.x = dot(cb2[0].xyzw, r0.xyzw);
r1.y = dot(cb2[1].xyzw, r0.xyzw);
o7.xyzw = r0.xyzw;

r20.xyzw=r0.xyzw;
float4 depth;
depth=dot(cb2[2].xyzw, r20.xyzw);
r20.x-=separation*(depth*convergence*0.01-convergence)*-cb2[10].y*iniparams.y;
r21.z = dot(cb2[2].xyzw, r20.xyzw);
r21.x = dot(cb2[0].xyzw, r20.xyzw);
r21.y = dot(cb2[1].xyzw, r20.xyzw);

r20.x = dot(r21.xyz, r21.xyz);

r0.x = dot(r1.xyz, r1.xyz);
o2.xyz = r21.xyz;
r0.yz = cb0[0].xy + r1.xy;
o2.w = sqrt(r20.x);
r1.xyzw = r0.yzyz / cb1[5].xxyy;
r0.xy = r0.yz / cb1[5].zz;
o4.xy = cb1[4].xy + r0.xy;
o3.xyzw = cb1[3].xyzw + r1.xyzw;
r0.xy = float2(-0.5,-0.5) + v1.xy;
r0.xy = r0.xy * float2(0.100000001,0.100000001) + cb2[13].xy;
r0.z = -cb2[13].w + cb2[12].x;
r0.w = r0.z / cb2[12].x;
r0.z = cb2[13].z / cb2[12].x;
o4.zw = r0.xy + r0.zw;
r0.xy = v1.xy * float2(0.5,0.5) + cb2[12].yz;
o5.xy = float2(-0.25,-0.25) + r0.xy;
o5.zw = v1.xy;
o6.x = cb2[12].x;
return;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
// Generated by Microsoft (R) D3D Shader Disassembler
//
// using 3Dmigoto v1.2.45 on Mon Oct 31 22:11:49 2016
//
//
// Input signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// POSITION 0 xyzw 0 NONE float xyz
// TEXCOORD 0 xy 1 NONE float xy
//
//
// Output signature:
//
// Name Index Mask Register SysValue Format Used
// -------------------- ----- ------ -------- -------- ------- ------
// SV_POSITION 0 xyzw 0 POS float xyzw
// COLOR 0 xyzw 1 NONE float xyzw
// TEXCOORD 0 xyzw 2 NONE float xyzw
// TEXCOORD 1 xyzw 3 NONE float xyzw
// TEXCOORD 2 xyzw 4 NONE float xyzw
// TEXCOORD 3 xyzw 5 NONE float xyzw
// TEXCOORD 4 x 6 NONE float x
// TEXCOORD 5 xyzw 7 NONE float xyzw
//
vs_5_0
dcl_globalFlags refactoringAllowed
dcl_constantbuffer cb0[1], immediateIndexed
dcl_constantbuffer cb1[6], immediateIndexed
dcl_constantbuffer cb2[14], immediateIndexed
dcl_input v0.xyz
dcl_input v1.xy
dcl_output_siv o0.xyzw, position
dcl_output o1.xyzw
dcl_output o2.xyzw
dcl_output o3.xyzw
dcl_output o4.xyzw
dcl_output o5.xyzw
dcl_output o6.x
dcl_output o7.xyzw
dcl_temps 2
mov r0.xyz, v0.xyzx
mov r0.w, l(1.000000)
dp4 r1.z, cb2[10].xyzw, r0.xyzw
add r1.w, r1.z, l(-70000.000000)
max r1.w, r1.w, l(0.000000)
mul r1.w, r1.w, l(0.000100)
min r1.w, r1.w, l(1.000000)
mad o0.z, r1.w, l(0.500000), r1.z
dp4 r1.x, cb2[8].xyzw, r0.xyzw
dp4 r1.y, cb2[9].xyzw, r0.xyzw
mov o0.xy, r1.xyxx
dp3 r1.x, r1.xyzx, r1.xyzx
sqrt r1.x, r1.x
mad_sat r1.x, r1.x, cb1[0].y, -cb1[0].x
log r1.x, r1.x
mul r1.x, r1.x, cb1[5].w
exp r1.x, r1.x
min r1.x, r1.x, cb1[2].w
dp4 o0.w, cb2[11].xyzw, r0.xyzw
add r1.yzw, -cb1[1].xxyz, cb1[2].xxyz
mad o1.xyz, r1.xxxx, r1.yzwy, cb1[1].xyzx
mov o1.w, r1.x
dp4 r1.z, cb2[2].xyzw, r0.xyzw
dp4 r1.x, cb2[0].xyzw, r0.xyzw
dp4 r1.y, cb2[1].xyzw, r0.xyzw
mov o7.xyzw, r0.xyzw
dp3 r0.x, r1.xyzx, r1.xyzx
mov o2.xyz, r1.xyzx
add r0.yz, r1.xxyx, cb0[0].xxyx
sqrt o2.w, r0.x
div r1.xyzw, r0.yzyz, cb1[5].xxyy
div r0.xy, r0.yzyy, cb1[5].zzzz
add o4.xy, r0.xyxx, cb1[4].xyxx
add o3.xyzw, r1.xyzw, cb1[3].xyzw
add r0.xy, v1.xyxx, l(-0.500000, -0.500000, 0.000000, 0.000000)
mad r0.xy, r0.xyxx, l(0.100000, 0.100000, 0.000000, 0.000000), cb2[13].xyxx
add r0.z, cb2[12].x, -cb2[13].w
div r0.w, r0.z, cb2[12].x
div r0.z, cb2[13].z, cb2[12].x
add o4.zw, r0.zzzw, r0.xxxy
mad r0.xy, v1.xyxx, l(0.500000, 0.500000, 0.000000, 0.000000), cb2[12].yzyy
add o5.xy, r0.xyxx, l(-0.250000, -0.250000, 0.000000, 0.000000)
mov o5.zw, v1.xxxy
mov o6.x, cb2[12].x
ret
// Approximately 0 instruction slots used

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



As you see, I copied some calculations to r20 and r21, imitating r0 and r1 but doing a correction at some point:

r20.x-=separation*(depth*convergence*0.01-convergence)*-cb2[10].y*iniparams.y;


This is still wrong, by the way. Multiplying by "-cb2[10].y" made reflections be at positive depth at two camera positions. iniparams.y is for the bloom hotkey, but I'm also using it now to toggle this effect quickly.

Imagine that I say north, east, south and west, about the camera position as I rotate. Without "-cb2[10].y", it would be:

- North: inside of the surface.
- East and west: surface level.
- South: outside of the surface.

With it:

- North and south: inside of the surface.
- East and west: surface level.


The shader is aware of my 360 degree camera position. My current code isn't the best I got for the water opacity problem (which affects those glaciers too). Not knowing what all those constant buffers are is annoying. If I somehow fix the opacity, I wonder how reflections will be in the end.

CPU: Intel Core i7 7700K @ 4.9GHz
Motherboard: Gigabyte Aorus GA-Z270X-Gaming 5
RAM: GSKILL Ripjaws Z 16GB 3866MHz CL18
GPU: MSI GeForce RTX 2080Ti Gaming X Trio
Monitor: Asus PG278QR
Speakers: Logitech Z506
Donations account: masterotakusuko@gmail.com

#69
Posted 11/01/2016 12:57 AM   
I was having some issues with the Nvidia profile posted on page 3 where the UI wasn't drawing at the screen depth, and weapons looked like they were being drawn through the wrong eyes. I made some changes to the profile which are giving me good results. Hopefully it helps someone. [code]Profile "SkyrimSE" UserSpecified=true ShowOn GeForce ProfileType Application Executable "skyrimse.exe" UserSpecified=true Setting ID_0x00a06946 = 0x780020f5 Setting ID_0x1033cec2 = 0x00000002 Setting ID_0x1033dcd3 = 0x00000004 Setting ID_0x70092d4a = 0xb19c3532 InternalSettingFlag=V0 Setting ID_0x701eb457 = 0x2241ab21 InternalSettingFlag=V0 Setting ID_0x702442fc = 0x1c22fe24 InternalSettingFlag=V0 SettingString ID_0x7049c7ec = "웪ꑌ" InternalSettingFlag=V0 SettingString ID_0x7051e5f5 = "籪鸙" InternalSettingFlag=V0 Setting ID_0x707f4b45 = 0x00000000 UserSpecified=true Setting ID_0x708db8c5 = 0x5c3300b3 InternalSettingFlag=V0 Setting ID_0x708db8c5 = 0x40f60b8c UserSpecified=true InternalSettingFlag=V0 Setting ID_0x709a1ddf = 0x4b1cd968 InternalSettingFlag=V0 Setting ID_0x709adada = 0x37f58357 InternalSettingFlag=V0 Setting ID_0x709adada = 0x51000002 UserSpecified=true InternalSettingFlag=V0 SettingString ID_0x70b5603f = "榛鳈⏙ꢗ" InternalSettingFlag=V0 Setting ID_0x70edb381 = 0x24208b6c InternalSettingFlag=V0 Setting ID_0x70f8e408 = 0x80b671fc InternalSettingFlag=V0 Setting ID_0x70f8e408 = 0x00000006 UserSpecified=true InternalSettingFlag=V0 EndProfile[/code]
I was having some issues with the Nvidia profile posted on page 3 where the UI wasn't drawing at the screen depth, and weapons looked like they were being drawn through the wrong eyes. I made some changes to the profile which are giving me good results. Hopefully it helps someone.

Profile "SkyrimSE" UserSpecified=true
ShowOn GeForce
ProfileType Application
Executable "skyrimse.exe" UserSpecified=true
Setting ID_0x00a06946 = 0x780020f5
Setting ID_0x1033cec2 = 0x00000002
Setting ID_0x1033dcd3 = 0x00000004
Setting ID_0x70092d4a = 0xb19c3532 InternalSettingFlag=V0
Setting ID_0x701eb457 = 0x2241ab21 InternalSettingFlag=V0
Setting ID_0x702442fc = 0x1c22fe24 InternalSettingFlag=V0
SettingString ID_0x7049c7ec = "웪ꑌ" InternalSettingFlag=V0
SettingString ID_0x7051e5f5 = "籪鸙" InternalSettingFlag=V0
Setting ID_0x707f4b45 = 0x00000000 UserSpecified=true
Setting ID_0x708db8c5 = 0x5c3300b3 InternalSettingFlag=V0
Setting ID_0x708db8c5 = 0x40f60b8c UserSpecified=true InternalSettingFlag=V0
Setting ID_0x709a1ddf = 0x4b1cd968 InternalSettingFlag=V0
Setting ID_0x709adada = 0x37f58357 InternalSettingFlag=V0
Setting ID_0x709adada = 0x51000002 UserSpecified=true InternalSettingFlag=V0
SettingString ID_0x70b5603f = "榛鳈⏙ꢗ" InternalSettingFlag=V0
Setting ID_0x70edb381 = 0x24208b6c InternalSettingFlag=V0
Setting ID_0x70f8e408 = 0x80b671fc InternalSettingFlag=V0
Setting ID_0x70f8e408 = 0x00000006 UserSpecified=true InternalSettingFlag=V0
EndProfile

#70
Posted 11/01/2016 02:10 AM   
I also had to make changes to the profile. With the one posted, the whole game was flat, but at a depth, and with broken shadows. This appears to work: [code]Profile "SkyrimSE" UserSpecified=true ShowOn GeForce ProfileType Application Executable "skyrimselauncher.exe" UserSpecified=true Executable "skyrimse.exe" UserSpecified=true Setting ID_0x00a06946 = 0x780020f5 Setting ID_0x1033cec2 = 0x00000002 Setting ID_0x1033dcd3 = 0x00000004 Setting ID_0x10f9dc81 = 0x00000011 UserSpecified=true Setting ID_0x70092d4a = 0xb19c3532 InternalSettingFlag=V0 Setting ID_0x701eb457 = 0x2241ab21 InternalSettingFlag=V0 Setting ID_0x702442fc = 0x1c22fe24 InternalSettingFlag=V0 SettingString ID_0x7049c7ec = "웪ꑌ" InternalSettingFlag=V0 SettingString ID_0x7051e5f5 = "籪鸙" InternalSettingFlag=V0 Setting ID_0x708db8c5 = 0x5c3300b3 InternalSettingFlag=V0 Setting ID_0x708db8c5 = 0x3ff13dd9 UserSpecified=true InternalSettingFlag=V0 Setting ID_0x709a1ddf = 0x4b1cd968 InternalSettingFlag=V0 Setting ID_0x709adada = 0x37f58357 InternalSettingFlag=V0 Setting ID_0x709adada = 0x51000002 UserSpecified=true InternalSettingFlag=V0 SettingString ID_0x70b5603f = "榛鳈⏙ꢗ" InternalSettingFlag=V0 Setting ID_0x70edb381 = 0x24208b6c InternalSettingFlag=V0 Setting ID_0x70f8e408 = 0x80b671fc InternalSettingFlag=V0 EndProfile[/code]
I also had to make changes to the profile. With the one posted, the whole game was flat, but at a depth, and with broken shadows. This appears to work:
Profile "SkyrimSE" UserSpecified=true
ShowOn GeForce
ProfileType Application
Executable "skyrimselauncher.exe" UserSpecified=true
Executable "skyrimse.exe" UserSpecified=true
Setting ID_0x00a06946 = 0x780020f5
Setting ID_0x1033cec2 = 0x00000002
Setting ID_0x1033dcd3 = 0x00000004
Setting ID_0x10f9dc81 = 0x00000011 UserSpecified=true
Setting ID_0x70092d4a = 0xb19c3532 InternalSettingFlag=V0
Setting ID_0x701eb457 = 0x2241ab21 InternalSettingFlag=V0
Setting ID_0x702442fc = 0x1c22fe24 InternalSettingFlag=V0
SettingString ID_0x7049c7ec = "웪ꑌ" InternalSettingFlag=V0
SettingString ID_0x7051e5f5 = "籪鸙" InternalSettingFlag=V0
Setting ID_0x708db8c5 = 0x5c3300b3 InternalSettingFlag=V0
Setting ID_0x708db8c5 = 0x3ff13dd9 UserSpecified=true InternalSettingFlag=V0
Setting ID_0x709a1ddf = 0x4b1cd968 InternalSettingFlag=V0
Setting ID_0x709adada = 0x37f58357 InternalSettingFlag=V0
Setting ID_0x709adada = 0x51000002 UserSpecified=true InternalSettingFlag=V0
SettingString ID_0x70b5603f = "榛鳈⏙ꢗ" InternalSettingFlag=V0
Setting ID_0x70edb381 = 0x24208b6c InternalSettingFlag=V0
Setting ID_0x70f8e408 = 0x80b671fc InternalSettingFlag=V0
EndProfile

#71
Posted 11/01/2016 02:32 AM   
Just wanted to pop in and say thank you to masterotaku and everyone else for having a go at getting this game working well in 3D. Thumbs up!!
Just wanted to pop in and say thank you to masterotaku and everyone else for having a go at getting this game working well in 3D.

Thumbs up!!

#72
Posted 11/01/2016 02:57 AM   
Hi I don't know whether this is the right place to ask but does anyone know how to enable custom aa using nvidia inspector? Have tried original skyrim compatibility bits, and Fallout 4 profile to apply some MSAA and SSAA but it does not seem to working at all. Am also not a big fan of TAA.
Hi I don't know whether this is the right place to ask but does anyone know how to enable custom aa using nvidia inspector? Have tried original skyrim compatibility bits, and Fallout 4 profile to apply some MSAA and SSAA but it does not seem to working at all. Am also not a big fan of TAA.

Intel Core I7 8700K @ 5ghz
Corsair Vengeance 3200mhz LXP ram (16GB)
MSI Nvidia RTX 2080Ti Ventus graphics card
Windows 10 64bit latest build
EVGA Supernova 1000w G2 PSU

Country: United Kingdom

#73
Posted 11/01/2016 12:13 PM   
I'm making some progress here. In knowledge at least. A bit. Remember when I talked about north, south, etc? Well, it's EXACTLY that. This is a post to remind me of my goals. With the rest of the vertex shader being what I posted in my previous post (I just replace text for all water shaders with Notepad++ when I make a code change), I saw that with this... [code] depth=dot(cb2[2].xyzw, r20.xyzw); r20.x+=separation*(depth-convergence)*iniparams.y; [/code] ...(iniparams.y is just to enable/disable this fix with F3) opacity is correct when I'm looking south and adjusting convergence depending on the distance (reflections is outside of the surface). Higher distance = need for less convergence. Higher FOV = need for more convergence, linearly. So if at X distance with 120 fov I need 33 convergence, with 60 fov I need 16.5 convergence (tested). When I look north, it's like a reverse fix (the wrongness is doubled) and the reflection is inside the surface, and when I look at east or west, the effect is wrong but kind of rotated, and the reflection is at surface depth. So what I need is making the shader correctly depend on convergence, distance, fov and rotation. This won't be easy. First step: making everything OK at 0 convergence.
I'm making some progress here. In knowledge at least. A bit. Remember when I talked about north, south, etc? Well, it's EXACTLY that. This is a post to remind me of my goals.

With the rest of the vertex shader being what I posted in my previous post (I just replace text for all water shaders with Notepad++ when I make a code change), I saw that with this...

depth=dot(cb2[2].xyzw, r20.xyzw);
r20.x+=separation*(depth-convergence)*iniparams.y;



...(iniparams.y is just to enable/disable this fix with F3) opacity is correct when I'm looking south and adjusting convergence depending on the distance (reflections is outside of the surface). Higher distance = need for less convergence. Higher FOV = need for more convergence, linearly. So if at X distance with 120 fov I need 33 convergence, with 60 fov I need 16.5 convergence (tested).

When I look north, it's like a reverse fix (the wrongness is doubled) and the reflection is inside the surface, and when I look at east or west, the effect is wrong but kind of rotated, and the reflection is at surface depth.

So what I need is making the shader correctly depend on convergence, distance, fov and rotation. This won't be easy.

First step: making everything OK at 0 convergence.

CPU: Intel Core i7 7700K @ 4.9GHz
Motherboard: Gigabyte Aorus GA-Z270X-Gaming 5
RAM: GSKILL Ripjaws Z 16GB 3866MHz CL18
GPU: MSI GeForce RTX 2080Ti Gaming X Trio
Monitor: Asus PG278QR
Speakers: Logitech Z506
Donations account: masterotakusuko@gmail.com

#74
Posted 11/02/2016 09:37 PM   
Pardon me if this is a dumb question, but aren't reflections [i]supposed[/i] to be behind the reflective surface? Because 1/s+1/s'=2/R, where R is the radius of the surface.
Pardon me if this is a dumb question, but aren't reflections supposed to be behind the reflective surface? Because 1/s+1/s'=2/R, where R is the radius of the surface.

#75
Posted 11/03/2016 03:25 AM   
  5 / 17    
Scroll To Top