小编Ivo*_*tão的帖子

Glsl mod vs Hlsl fmod

我在HLSL中实现了这个问题中描述的螺旋GLSL着色器,但结果并不相同.我认为这是因为mod我已经fmod在HLSL中翻译了GLSL 中的函数.我怀疑只有在fmod函数输入中有负数时才会出现此问题.

我已经尝试mod通过调用我已经制作的函数替换调用来执行GLSL文档中描述的函数并且它可以工作:

mod返回xmodulo 的值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 …

opengl math directx glsl hlsl

13
推荐指数
1
解决办法
2万
查看次数

Reflection.Emit中的短格式操作码出错

我正在制作一种与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 …

c# reflection.emit hlsl opcode

3
推荐指数
1
解决办法
1572
查看次数

获取泛型抽象类的默认构造函数

我有一个通用的抽象基类,我想从中通过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)

我已经尝试了所有东西,长度始终为零.我不明白.我在反射器中检查了类似的情况,确实调用了抽象类的基础构造函数.问题是如何让它做同样的事情?

c# reflection reflection.emit

1
推荐指数
1
解决办法
1164
查看次数

标签 统计

c# ×2

hlsl ×2

reflection.emit ×2

directx ×1

glsl ×1

math ×1

opcode ×1

opengl ×1

reflection ×1