标签: hlsl

If语句会减慢我的着色器吗?

我想知道着色器内部的"If-statements"(顶点/片段/像素......)是否真的会降低着色器性能.例如:

使用它更好吗:

vec3 output;
output = input*enable + input2*(1-enable);
Run Code Online (Sandbox Code Playgroud)

而不是使用这个:

vec3 output;
if(enable == 1)
{
    output = input;
}
else
{
    output = input2;
}
Run Code Online (Sandbox Code Playgroud)

在另一个论坛上有一个关于那个的讨论(2013):http://answers.unity3d.com/questions/442688/shader-if-else-performance.html 这里有人说,If语句真的很糟糕用于着色器的性能.

此外,他们还在讨论if/else语句(2012)中的内容:https: //www.opengl.org/discussion_boards/showthread.php/177762-Performance-alternative-for-if-(-)

也许硬件或着色器编译器现在更好,他们修复了这个(可能不存在)性能问题.

编辑:

在这种情况下,这里假设enable是一个统一变量,它总是设置为0:

if(enable == 1) //never happens
{
    output = vec4(0,0,0,0);
}
else  //always happens
{
    output = calcPhong(normal, lightDir);
}
Run Code Online (Sandbox Code Playgroud)

我想在这里我们在着色器中有一个分支,它会降低着色器的速度.那是对的吗?

制作2个不同的阴影是否更有意义,比如一个用于其他阴影,另一个用于if部分?

opengl shader direct3d glsl hlsl

53
推荐指数
2
解决办法
3万
查看次数

从剪辑空间到屏幕坐标的转换是什么时候发生的?

我正在研究渲染管道,当我到达剪辑阶段时,我们解释说,从视图(眼睛或相机)空间我们必须传递到剪辑空间,也称为规范化设备空间(NDC),即立方体空间从-1到1.

但是,现在我不明白从这个空间到屏幕坐标空间的通道何时发生:

  1. 剪切后和光栅化之前?

  2. 光栅化后和剪刀和z测试之前?

  3. 在写入帧缓冲区之前的最后?

opengl graphics rendering hlsl

31
推荐指数
2
解决办法
3万
查看次数

归一化从[0.5 - 1]到[0 - 1]

我有点被困在这里,我想这有点像脑筋急转弯.如果我的数字在0.5到1之间,我怎样才能将其标准化为0到1?

感谢您的帮助,也许我只是有点慢,因为我已经连续24小时工作O_O

c++ math normalize hlsl

27
推荐指数
5
解决办法
3万
查看次数

如何计算像素着色器深度以将点精灵上绘制的圆渲染为与其他对象相交的球体?

我正在编写一个着色器,通过绘制阴影圆圈在点精灵上渲染球体,并且需要编写深度分量和颜色,以便彼此相邻的球体正确相交.

我使用的代码类似于Johna Holwerda编写的代码:

void PS_ShowDepth(VS_OUTPUT input, out float4 color: COLOR0,out float depth : DEPTH)
{
   float dist = length (input.uv - float2 (0.5f, 0.5f)); //get the distance form the center of the point-sprite
   float alpha = saturate(sign (0.5f - dist));
   sphereDepth = cos (dist * 3.14159) * sphereThickness * particleSize; //calculate how thick the sphere should be; sphereThickness is a variable.

   depth = saturate (sphereDepth + input.color.w); //input.color.w represents the depth value of the pixel on …
Run Code Online (Sandbox Code Playgroud)

math directx 3d shader hlsl

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

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万
查看次数

为什么HLSL有语义?

在HLSL中,我必须使用语义将信息从顶点着色器传递到片段着色器.在GLSL中,不需要语义.语义的客观利益是什么?

示例:GLSL

顶点着色器

varying vec4 foo
varying vec4 bar;

void main() {
  ...
  foo = ...
  bar = ...
}
Run Code Online (Sandbox Code Playgroud)

片段着色器

varying vec4 foo
varying vec4 bar;

void main() {
  gl_FragColor = foo * bar;
}
Run Code Online (Sandbox Code Playgroud)

示例:HLSL

顶点着色器

struct VS_OUTPUT
{
   float4  foo : TEXCOORD3;
   float4  bar : COLOR2;
}

VS_OUTPUT whatever()
{
  VS_OUTPUT out;

  out.foo = ...
  out.bar = ...

  return out;
}
Run Code Online (Sandbox Code Playgroud)

像素着色器

void main(float4 foo : TEXCOORD3,
          float4 bar : COLOR2) : COLOR
{
    return foo * …
Run Code Online (Sandbox Code Playgroud)

glsl hlsl

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

VS2010 - HLSL Intellisense?

是否有任何免费组件可以为HLSL提供突出显示和/或智能感知功能?

我见过一些名为"InteliSense.Net"的内容,但作者的网站已关闭,我无法在任何地方找到下载内容.

intellisense hlsl visual-studio-2010

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

条件和未使用的采样器/纹理添加到SM2/3像素着色器的性能有多大?

我们在HLSL中有一个像素着色器,它在一些地方用于稍微不同的东西,因此有几个条件块意味着在某些情况下省略了复杂的功能.同样,这意味着我们将纹理作为采样器参数传递,而这些参数可能并不总是被使用.

我不知道这两件事增加了多少性能,但特别是因为我们在集成图形芯片上支持SM2.0,效率低下是个问题.那么,传递纹理而不使用它意味着任何额外的开销吗?并且使用if简单的行为来添加一些指令,还是会因为停顿等而对其进行大幅度的影响,就像进行CPU优化一样?

shader rendering hlsl pixel-shader

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

一些简单的XNA/HLSL问题

我最近一直在进行HLSL编程,我很好奇我正在做的一些事情是如何工作的.

例如,我在这里有一个非常简单的着色器,可以将任何蓝绿色的像素调整为红色.

sampler2D mySampler;

float4 MyPixelShader(float2 texCoords : TEXCOORD0): COLOR
{
    float4 Color;
    Color = tex2D(mySampler, texCoords.xy);

    if(Color.r == 0 && Color.g == 1.0 && Color.b == 1.0)
    {
        Color.r = 1.0;
        Color.g = 0.5;
        Color.b = 0.5;
    }
    return Color;
}

technique Simple
{
    pass pass1
    {
        PixelShader = compile ps_2_0 MyPixelShader();
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道该tex2D函数在指定的位置抓取像素的颜色,但我不明白的是mySampler甚至有任何数据.我根本没有设置它或传入纹理,但它神奇地包含我的纹理数据.

另外,是什么样的东西之间的区别: COLORCOLOR0TEXCOORDTEXCOORD0

我可以采取合乎逻辑的猜测,并说这COLOR0是装配中的注册表,其中包含GPU中当前使用的像素颜色.(这可能完全错了,我只是陈述我的想法)

如果是这样,这是否意味着指定类似float2 texCoords : TEXCOORD0意志的东西,默认情况下,抓住GPU正在处理的当前位置?

c# shader xna hlsl

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

像素着色器效果示例

我已经看过许多像素着色器效果示例,像图像上的漩涡一样.但我想知道是否有人知道任何示例或教程更实用的着色器效果?

我并不是说漩涡效果没有它的用​​途,只是我发现的许多例子都有解释的基本效果,而不是如何巧妙地使用其他效果或过渡到产生美妙的效果.有一个视频在这里,它概述所有的WPF效果库,但我不知道我怎么会用他们有的在实际环境.

例如,当Flash 8出现模糊等效果时,我发现了一个精彩的视频,展示了如何使用模糊效果创建一个带有超速文本的炫酷效果,该视频启发了许多关于我可以用Flash中的效果做些什么的想法8.我正在寻找与Pixel Shader Effects类似的东西.

wpf effects hlsl pixel-shader

10
推荐指数
2
解决办法
7506
查看次数