上周,我在HLSL
中创建了一个基于条件的像素着色器。目的是仅对满足特定条件的像素进行着色。在我的情况下,条件是基于“时间” 的,我松了口气,因为这不是我们认为的传统时间。我正在3D空间中绘制一条直线,这是一项微不足道的任务。但是,基于当前用户选择的时间,仅应显示行的特定百分比。
我创建了一个Line
类,并向表单中添加了SliderControl
,以允许用户控制当前时间点。这很容易完成,就像设置所有基础代码一样。
在创建基础代码时,我在时间类型上犯了一个简单的错误。在当前时间的常量缓冲区中,我使用了double
;在我的Vertex
结构(任意定义和输入以及像素着色器输入)中,我使用了float
。这导致像素着色器中的条件始终导致false
。造成这种差异的原因是原始数据的类型为double
,但是我最终选择了float
来匹配代码中的所有其他内容,再加上使用{{1} }输入double
。
代码非常简单:
HLSL
为什么永远不会渲染线条?
答案 0 :(得分:0)
这里的问题是由于cbuffer
和struct
的输入类型不同所致。只需使类型匹配即可:
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的原因,可以找到一个很好的详尽答案。我最初不理解这是一个问题,因为我假设可以像其他任何数字类型一样比较double
和float
。但是,我错了,正如上面链接中所述:
考虑浮点数或双数的重要因素是:
精度:浮点数的精度是它可以表示多少位数而不会丢失其包含的任何信息。
舍入:
binary
和decimal (base 10)
数字之间没有明显的区别。考虑分数1/10
。在decimal
中,可以很容易地将其表示为0.1
,并且可以将0.1
视为一个易于表示的数字。但是,在二进制中,0.1
由无限序列表示:0.00011001100110011…
。
但是,int
和float
而不是double
和float
似乎也很重要。