GLSL 到 HLSL 问题

GLSL to HLSL issues

我正在尝试通过将 GLSL 转换为 HLSL 将 GL Transitions 中的许多转换导入到我的视频序列器中。

例如,这个简单的 cross fade:

vec4 transition (vec2 uv) {
  return mix(
    getFromColor(uv),
    getToColor(uv),
    progress
  );
}

在我的 HLSL 代码中被正确翻译:

#define D2D_INPUT_COUNT 2
#define D2D_INPUT0_SIMPLE
#define D2D_INPUT1_SIMPLE
#define D2D_REQUIRES_SCENE_POSITION // The pixel shader requires the SCENE_POSITION input.
#include "d2d1effecthelpers.hlsli"

cbuffer constants : register(b0)
{
    float progress : packoffset(c0.x);
...
}


float4 crossfade(float4 v1,float4 v2)
{
    return lerp(v1, v2, progress);    
}



D2D_PS_ENTRY(main)
{

   float4 v1 = D2DGetInput(0);
   float4 v2 = D2DGetInput(1);
   return crossfade(v1,v2);
}

同样不适用于Wind effect:

// Custom parameters
uniform float size; // = 0.2

float rand (vec2 co) {
  return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

vec4 transition (vec2 uv) {
  float r = rand(vec2(0, uv.y));
  float m = smoothstep(0.0, -size, uv.x*(1.0-size) + size*r - (progress * (1.0 + size)));
  return mix(
    getFromColor(uv),
    getToColor(uv),
    m
  );
}

这次HLSL是这样的:

float fract(float x)
{
    return x - floor(x);
}

float rand(float2 co)
{
    return fract(sin(dot(co.xy, float2(12.9898, 78.233))) * 43758.5453);
}


float4 wind(float4 v1, float4 v2,float2 uv)
{
  float r = rand(float2(0, uv.y));
    p1 = 0.2f;
    progress = 0.5f; // hardcoded variables for testing, they will be taken from the buffer
  float m = smoothstep(0.0f, -p1, uv.x*(1.0f-p1) + p1*r - (progress * (1.0f + p1)));
    return lerp(v1, v2, m);
}


D2D_PS_ENTRY(main)
{
  
        float4 v1 = D2DGetInput(0);
        float4 v2 = D2DGetInput(1);
        return wind(v1,v2,D2DGetScenePosition().xy);
}

我是不是误解了 OpenGL 的 mixfract 以及 rand 的东西?我只得到我的 HLSL 版本中的第二个图像像素而没有混合。

编辑:我已将大小硬编码为 0.992,并在 HLSL 中将进度乘以 4。现在它似乎工作了,我是否遗漏了一些与边界相关的问题? smoothstep 函数是否按预期工作?

我找到了。

需要在主条目中使用 D2DGetInputCoordinate 而不是 D2DGetScenePosition

这样做之后,转换 运行 很好。