数值条件永远不成立?

时间:2018-11-26 16:50:54

标签: types hlsl

概述

上周,我在HLSL中创建了一个基于条件的像素着色器。目的是仅对满足特定条件的像素进行着色。在我的情况下,条件是基于“时间” 的,我松了口气,因为这不是我们认为的传统时间。我正在3D空间中绘制一条直线,这是一项微不足道的任务。但是,基于当前用户选择的时间,仅应显示行的特定百分比。

我创建了一个Line类,并向表单中添加了SliderControl,以允许用户控制当前时间点。这很容易完成,就像设置所有基础代码一样。


问题

在创建基础代码时,我在时间类型上犯了一个简单的错误。在当前时间的常量缓冲区中,我使用了double;在我的Vertex结构(任意定义和输入以及像素着色器输入)中,我使用了float。这导致像素着色器中的条件始终导致false。造成这种差异的原因是原始数据的类型为double,但是我最终选择了float来匹配代码中的所有其他内容,再加上使用{{1} }输入double


HLSL

代码非常简单:

HLSL

问题

为什么永远不会渲染线条?

1 个答案:

答案 0 :(得分:0)

这里的问题是由于cbufferstruct的输入类型不同所致。只需使类型匹配即可:

cbuffer TimeBuffer : register(b4) {
    float CurrentTime;
}
struct VertexInput {
    float Time;
    //...
}
struct PixelInput {
    float Time;
    //...
}
float4 PSMain(PixelInput input) : SV_Target {
    float4 result = 0;
    if (input.Time < CurrentTime)
        result = input.Diffuse;

    return result;
}

简单地将result的初始赋值更改为float4(0, 1, 0, 0)或其他一些纯色将显示该线确实已被渲染,但是该条件永远不会被评估为true


对于here的原因,可以找到一个很好的详尽答案。我最初不理解这是一个问题,因为我假设可以像其他任何数字类型一样比较doublefloat。但是,我错了,正如上面链接中所述:

  

考虑浮点数或双数的重要因素是:

     

精度:浮点数的精度是它可以表示多少位数而不会丢失其包含的任何信息。

     

舍入binarydecimal (base 10)数字之间没有明显的区别。考虑分数1/10。在decimal中,可以很容易地将其表示为0.1,并且可以将0.1视为一个易于表示的数字。但是,在二进制中,0.1由无限序列表示:0.00011001100110011…


但是,intfloat而不是doublefloat似乎也很重要。