标签: pixel-shader

对HLSL 2D着色器教程的建议?

我正在寻找一些用于编写2D着色器的资源(不是 3D,所以请不要引用顶点着色器代码或类似的东西).我正在使用HLSL,但在寻找好的教程方面遇到了很多麻烦.

有什么建议?

resources 2d hlsl pixel-shader

5
推荐指数
0
解决办法
1729
查看次数

如何在Silverlight中围绕圆柱包装图像

我正在尝试在silverlight中围绕圆柱体包裹图像.我在谷歌看了很多,但没有找到任何东西.据我所知,它可以用像素着色器完成,但不知道如何.
可能吗?
谢谢.

silverlight silverlight-3.0 silverlight-4.0 pixel-shader

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

在像素着色器中计算世界空间坐标

我有一个像素着色器,我想根据我的世界空间坐标来计算每个像素的位置。我该怎么做?我需要什么?

我有一个ps_input具有float4位置的结构:SV_POSITION。我假设这很重要,但是存储在里面的值似乎有点可笑。

我似乎无法弄清楚它们之间的关系。例如,如果一个像素是2d,那么为什么它具有w分量或z分量呢?

我正在使用DirectX,并且像素着色器在中HLSLC++作为我在CPU上的编程语言。

任何帮助,将不胜感激。

directx position hlsl pixel-shader

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

通过HLSL中的像素着色器传递颜色

我有一个像素着色器应该只是通过输入颜色,但我得到一个恒定的结果.我认为我的语法可能是问题所在.这是着色器:

struct PixelShaderInput
{
    float3 color : COLOR;
};

struct PixelShaderOutput
{
    float4 color : SV_TARGET0;
};

PixelShaderOutput main(PixelShaderInput input)
{
    PixelShaderOutput output; 
    output.color.rgba = float4(input.color, 1.0f); // input.color is 0.5, 0.5, 0.5; output is black
    // output.color.rgba = float4(0.5f, 0.5f, 0.5f, 1); // output is gray
    return output;
}
Run Code Online (Sandbox Code Playgroud)

为了测试,我在pipleline中有一个顶点着色器,它传递COLOR参数0.5,0.5,0.5.单步执行VisualStudio中的像素着色器,input.color具有正确的值,并且这些值正确地被输出到output.color.但是,渲染时,使用此着色器的顶点都是黑色的.

这是顶点着色器元素描述:

const D3D11_INPUT_ELEMENT_DESC vertexDesc[] = 
{
    { "POSITION",   0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "COLOR",      0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { "TEXCOORD",   0, DXGI_FORMAT_R32G32_FLOAT,    0, …
Run Code Online (Sandbox Code Playgroud)

direct3d hlsl pixel-shader

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

防止像素着色器过度绘制单个ERG

背景

使用gluTess从GDI + DrawString(..)路径在Direct3D9中构建三角形列表:

镶嵌文字

然后使用像素着色器(v3.0)填充形状.使用不透明值绘制时,一切看起来都很好:

不透明的输出

问题

在某些字体大小的情况下,如果颜色具有alpha分量(即Argb#55FFFFFF),我们就会开始看到这些令人讨厌的镶嵌瑕疵,其中三角形可能会稍微重叠:

透明输出

在较大的字体大小时,问题有时不存在:

更大的字体测试

使用英特尔出色的GPA帧分析器像素历史工具,我们可以看到出现伪像的区域,像素已从单个Erg"触摸"了3次.

Erg分析

我试图找出如何阻止我的像素着色器不止一次触摸同一个像素.

与过度绘制预防相关的其他解决方案似乎都与zbuffer策略有关,但是这个问题更多地与在单个像素着色器通道内绘制单个2D三角形列表有关.

我试图想出一个解决方案,我有点失落.我希望HLSL可能有某种"触摸每个像素只有一次"的标志,但我一直无法找到类似的东西.我发现最接近的是将BLENDOP设置为MAX而不是ADD.但是在场景中混合其他颜色时输出不正确.

我也有SRCBLEND = ONE,DSTBLEND = INVSRCALPHA.产生正确输出的唯一标志组合(尽管有过度绘制工件.)

我在GPA帧分析器中使用了SEPARATEALPHABLENDENABLE,听起来几乎就像我在这里所需要的那样 - 将混合设置为MAX但仅限于"alpha"通道,但是根据我的判断,该设置(以及相应的BLENDOPALPHA)会影响什么都没有.

我想到的最后一件事是将文本烘焙到纹理上不透明,然后将该纹理重新涂抹到场景中并应用适当的alpha值,但是这实际上并不适用于此项目,因为我还支持渐变画笔,其中停止值可能包含alpha,意味着仍然可以看到伪影,或者如果我们在烘焙到纹理之前将alpha从终止值中剥离,则最终输出只是完全错误.此外,整个努力将是非常昂贵的.

任何提示或指示将不胜感激.谢谢阅读.

direct3d hlsl pixel-shader tessellation

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

将多个纹理传递给LibGDX中的着色器

我需要将2个(或更多)纹理传递给一个着色器.此外,我必须在渲染方法中绑定纹理,因为我使用FrameBuffer并尝试在飞行中绑定纹理.所以,我的代码如下:

@Override
public void show () {
      fbo = new FrameBuffer(Format.RGB565, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), false);

      shader = new ShaderProgram(Gdx.files.internal("shaders/vertex.glsl"), Gdx.files.internal("shaders/test_fragment.glsl"));
    ...
}

@Override
public void render(float delta) {

    fbo.begin();        
    Gdx.graphics.getGL20().glClearColor( 0.0f, 0.0f, 0.0f, 1f );
    Gdx.graphics.getGL20().glClear( GL20.GL_COLOR_BUFFER_BIT | GL20.GL_DEPTH_BUFFER_BIT );      

    cam.update();

    spriteBatch.setProjectionMatrix(cam.combined);

    spriteBatch.begin();        
    spriteBatch.draw(someImage, 0, 0, width, height);                   
    spriteBatch.end();
    fbo.end();

    Texture texture = fbo.getColorBufferTexture();

    time+=Gdx.graphics.getDeltaTime();      

    shader.begin();

     shader.setUniformMatrix(u_wview, cam.projection);
     Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE0);
     texture.bind(0);

     shader.setUniformi("u_texture", 0); //passing first texture!!!

     Gdx.graphics.getGL20().glActiveTexture(GL20.GL_TEXTURE1);       
     tex2.bind(1);
     shader.setUniformi("u_texture2", 1); //passing second texture!!!


    shader.setUniformf(u_res, new Vector2(Gdx.graphics.getWidth(),Gdx.graphics.getHeight())); 
    shader.setUniformf(u_time, time);


    mesh.render(shader, GL20.GL_TRIANGLES); …
Run Code Online (Sandbox Code Playgroud)

android pixel-shader fragment-shader opengl-es-2.0 libgdx

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

是否存在DirectX指南,用于在绘制调用之间绑定和解除绑定资源?

所有DirectX书籍和教程都强烈建议将绘制调用之间的资源分配减少到最低限度 - 但我找不到任何可以深入了解细节的指南.回顾网上发现的大量示例代码,我得出结论,程序员对此主题有完全不同的编码原则.有些甚至设置和取消设置

VS/PS 
VS/PS ResourceViews
RasterizerStage 
DepthStencilState
PrimitiveTopology
... 
Run Code Online (Sandbox Code Playgroud)

每次绘制调用之前和之后(虽然设置保持不变),而其他人则没有.

我猜这有点过头了......

从我自己的实验,我发现,我不得不在每次绘制调用绑定的唯一资源是ShaderResourceViews(以VSPS在我的情况).此要求可能是由于使用计算着色器引起的,因为我绑定/取消绑定UAVs到绑定到VS/ PS稍后的缓冲区.

在我发现这种重新绑定是必要的之前,我已经失去了许多小时的工作.而且我想许多程序员也不确定,并且更愿意解开并重新绑定"有点太多"而不是陷入类似的陷阱.

问题1:关于这个问题至少有一些经验法则吗?

问题2:我的ShaderResourceViews绑定是否可能VS/PS被驱动程序/ DirectX核心解除绑定,因为我UAVs 在CS调度调用之前绑定了相同的缓冲区(我没有解除绑定SRVs自己)?

问题3:VS/PS在使用计算着色器之前,我甚至没有设置为null.没有问题的工作但我总是不确定我是否正在使用这种"懒惰"的方法挖掘我的下一个陷阱.

directx-11 pixel-shader compute-shader vertex-shader

4
推荐指数
2
解决办法
1861
查看次数

在Interface Builder(Xcode)中使用Shadertoy的着色器

我试图使用精灵工具包在Interface Builder中查看着色器的样子,并希望在ShaderToy中使用一些着色器.为此,我创建了一个"shader.fsh"文件,一个场景文件,并为场景添加了一个颜色精灵,为它提供了一个自定义着色器(shader.fsh)

虽然非常基本的着色器似乎有效:

void main() {
    gl_FragColor = vec4(0.0,1.0,0.0,1.0);
}
Run Code Online (Sandbox Code Playgroud)

我从ShaderToy转换着色器的任何尝试都会导致Xcode在尝试渲染它们时冻结(旋转彩球).

我正在使用的着色器是这样的:

#define M_PI 3.1415926535897932384626433832795

float rand(vec2 co)
{
    return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * 43758.5453);
}

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    float size = 30.0;
    float prob = 0.95;

    vec2 pos = floor(1.0 / size * fragCoord.xy);

    float color = 0.0;
    float starValue = rand(pos);

    if (starValue > prob)
    {
        vec2 center = size * pos + vec2(size, …
Run Code Online (Sandbox Code Playgroud)

opengl opengl-es interface-builder pixel-shader ios

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

DirectX 11 Pixel Shader什么是SV_POSITION?

我正在学习DirectX 11的HLSL,我想知道SV_POSITION是什么,它是Vertex Shader的输出,还是Pixel Shader的输入。

1:是屏幕上每个像素或对象的x,y,z?

2:为什么有4个32位浮点数?

3:顶点输出需要这个系统变量吗?

谢谢!

hlsl directx-11 pixel-shader vertex-shader

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

为什么“警告 X4000:使用潜在未初始化的变量”显示了不止一种常用方法的用法?

我在hlsli有一个常用的方法

/// RendererShaderTypes.hlsli
///
static inline float4 OverlayColor(float2 texOverlay, float4 videoColor)
{

      float4 texColor = float4(imageMixTexture[4].Sample(imageMixSampler[4], texOverlay));
      if (texColor.r == keyColor.r &&
          texColor.g == keyColor.g &&
          texColor.b == keyColor.b)
      {
          return videoColor;
      }
      return lerp(texColor, videoColor, transparency);
}
Run Code Online (Sandbox Code Playgroud)

它是从多个 hlsl 像素着色器调用的。

#include "RendererShaderTypes.hlsli"
float4 main(PSPosTexOverlay input) : SV_TARGET
{
    return OverlayColor(input.texOverlay, backColor);
}
Run Code Online (Sandbox Code Playgroud)

也调用另一个像素着色器

#include "RendererShaderTypes.hlsli"
float4 main(PSPosVideoTexture input) : SV_TARGET
{
     // lookup color of video
     float4 mixColor = mul(colorMatrix[0], VideoColor(imageMixSampler[0], imageMixTexture[0], input.texImage));
     mixColor.rgb *= mixColor.a;
     mixColor.a = 1.0f; …
Run Code Online (Sandbox Code Playgroud)

c++ hlsl directx-11 pixel-shader

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