首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GLSL到HLSL问题

GLSL到HLSL问题
EN

Stack Overflow用户
提问于 2020-11-14 18:20:35
回答 1查看 359关注 0票数 1

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

例如,这个简单的cross fade

代码语言:javascript
复制
vec4 transition (vec2 uv) {
  return mix(
    getFromColor(uv),
    getToColor(uv),
    progress
  );
}

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

代码语言:javascript
复制
#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

代码语言:javascript
复制
// 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是这样的:

代码语言:javascript
复制
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的mixfractrand之类的东西?在我的HLSL版本中,我只获得了第二个图像像素,而没有进行混合。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-15 05:15:07

我找到了。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64832839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档