我在HLSL中实现了这个问题中描述的螺旋GLSL着色器,但结果并不相同.我认为这是因为mod
我已经fmod
在HLSL中翻译了GLSL 中的函数.我怀疑只有在fmod
函数输入中有负数时才会出现此问题.
我已经尝试mod
通过调用我已经制作的函数替换调用来执行GLSL文档中描述的函数并且它可以工作:
mod
返回x
modulo 的值y
.计算方法如下x - y * floor(x/y)
.
我使用的工作代码fmod
是:
float mod(float x, float y)
{
return x - y * floor(x/y)
}
Run Code Online (Sandbox Code Playgroud)
与GLSL相比mod
,MSDN表示 HLSL fmod
功能可以做到这一点:
计算浮点余数,使得
x = i * y + f
其中i
,整数f
具有与其相同的符号x
,并且绝对值f
小于绝对值y
.
我使用了HLSL到GLSL转换器,并将该fmod
函数翻译为mod
.但是,我不知道我是否可以假设mod
转换为fmod …
我正在制作一种与hlsl非常相似但只支持像素着色器的小语言.此语言使用reflection.emit构建实现相同功能的点网络程序集.我正在测试我的分支指令"if"的实现,并且在我的一个单元测试中(一个大的if if inner if else)失败并出现以下错误消息:
System.NotSupportedException:位置上的非法单字节分支:32.请求的分支是:132.
在我的案例OpCodes.Br_S中,我已经将问题追溯到使用简短格式指令.解决方案很简单,我用OpCodes.Br替换了OpCodes.Br_S但是我对这个解决方案有几个问题:
此解决方案对生成的代码的性能有影响吗?如果我想为单个字节正确生成Br_S而对于其他情况需要Br,我该怎么做?这里的问题是我正在使用访问者模式和像"if"这样的分支指令我必须首先输出Br或Br_s,此时我无法知道剩下的代码是否需要多个单字节跳到标签.为了更好地说明我的问题,这是我为以下语句生成的代码:
我的语言:
int a = -1; if (1>1) { a=1; } else if(2>2) { a=2; }
IL:
.method public virtual final instance int32 Main() cil managed
{
.maxstack 4
.locals init (
[0] int32 num)
L_0000: ldc.i4.m1
L_0001: stloc.0
L_0002: ldc.i4.1
L_0003: ldc.i4.1
L_0004: ble.s L_000a
L_0006: ldc.i4.1
L_0007: stloc.0
L_0008: br.s L_0010
L_000a: ldc.i4.2
L_000b: ldc.i4.2
L_000c: ble.s L_0010
L_000e: ldc.i4.2
L_000f: stloc.0
L_0010: ldloc.0
L_0011: ret
Run Code Online (Sandbox Code Playgroud)
}
int a …
我有一个通用的抽象基类,我想从中通过reflection.emit构建一个动态类型.此外,我需要自定义派生类的默认构造函数来初始化一些字段.要正确构建派生类的默认构造函数,我需要获取基类的默认构造函数并调用它.问题是我无法从基类中获取默认构造函数.
一个例子:
public abstract class Test<T>
{
private T data;
public abstract void Go();
}
public class TestDerive : Test<int>
{
public override void Go()
{
}
}
class Program
{
static void Main(string[] args)
{
ConstructorInfo[] constructors = typeof(Test<>).GetConstructors();
int length = constructors.Length;
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了所有东西,长度始终为零.我不明白.我在反射器中检查了类似的情况,确实调用了抽象类的基础构造函数.问题是如何让它做同样的事情?