我正在寻找一些用于编写2D着色器的资源(不是 3D,所以请不要引用顶点着色器代码或类似的东西).我正在使用HLSL,但在寻找好的教程方面遇到了很多麻烦.
有什么建议?
我正在尝试在silverlight中围绕圆柱体包裹图像.我在谷歌看了很多,但没有找到任何东西.据我所知,它可以用像素着色器完成,但不知道如何.
可能吗?
谢谢.
我有一个像素着色器,我想根据我的世界空间坐标来计算每个像素的位置。我该怎么做?我需要什么?
我有一个ps_input具有float4位置的结构:SV_POSITION。我假设这很重要,但是存储在里面的值似乎有点可笑。
我似乎无法弄清楚它们之间的关系。例如,如果一个像素是2d,那么为什么它具有w分量或z分量呢?
我正在使用DirectX,并且像素着色器在中HLSL。C++作为我在CPU上的编程语言。
任何帮助,将不胜感激。
我有一个像素着色器应该只是通过输入颜色,但我得到一个恒定的结果.我认为我的语法可能是问题所在.这是着色器:
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) 使用gluTess从GDI + DrawString(..)路径在Direct3D9中构建三角形列表:

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

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

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

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

我试图找出如何阻止我的像素着色器不止一次触摸同一个像素.
与过度绘制预防相关的其他解决方案似乎都与zbuffer策略有关,但是这个问题更多地与在单个像素着色器通道内绘制单个2D三角形列表有关.
我试图想出一个解决方案,我有点失落.我希望HLSL可能有某种"触摸每个像素只有一次"的标志,但我一直无法找到类似的东西.我发现最接近的是将BLENDOP设置为MAX而不是ADD.但是在场景中混合其他颜色时输出不正确.
我也有SRCBLEND = ONE,DSTBLEND = INVSRCALPHA.产生正确输出的唯一标志组合(尽管有过度绘制工件.)
我在GPA帧分析器中使用了SEPARATEALPHABLENDENABLE,听起来几乎就像我在这里所需要的那样 - 将混合设置为MAX但仅限于"alpha"通道,但是根据我的判断,该设置(以及相应的BLENDOPALPHA)会影响什么都没有.
我想到的最后一件事是将文本烘焙到纹理上不透明,然后将该纹理重新涂抹到场景中并应用适当的alpha值,但是这实际上并不适用于此项目,因为我还支持渐变画笔,其中停止值可能包含alpha,意味着仍然可以看到伪影,或者如果我们在烘焙到纹理之前将alpha从终止值中剥离,则最终输出只是完全错误.此外,整个努力将是非常昂贵的.
任何提示或指示将不胜感激.谢谢阅读.
我需要将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) 所有DirectX书籍和教程都强烈建议将绘制调用之间的资源分配减少到最低限度 - 但我找不到任何可以深入了解细节的指南.回顾网上发现的大量示例代码,我得出结论,程序员对此主题有完全不同的编码原则.有些甚至设置和取消设置
VS/PS
VS/PS ResourceViews
RasterizerStage
DepthStencilState
PrimitiveTopology
...
Run Code Online (Sandbox Code Playgroud)
在每次绘制调用之前和之后(虽然设置保持不变),而其他人则没有.
我猜这有点过头了......
从我自己的实验,我发现,我不得不在每次绘制调用绑定的唯一资源是ShaderResourceViews(以VS和PS在我的情况).此要求可能是由于使用计算着色器引起的,因为我绑定/取消绑定UAVs到绑定到VS/ PS稍后的缓冲区.
在我发现这种重新绑定是必要的之前,我已经失去了许多小时的工作.而且我想许多程序员也不确定,并且更愿意解开并重新绑定"有点太多"而不是陷入类似的陷阱.
问题1:关于这个问题至少有一些经验法则吗?
问题2:我的ShaderResourceViews绑定是否可能VS/PS被驱动程序/ DirectX核心解除绑定,因为我UAVs 在CS调度调用之前绑定了相同的缓冲区(我没有解除绑定SRVs自己)?
问题3:VS/PS在使用计算着色器之前,我甚至没有设置为null.没有问题的工作但我总是不确定我是否正在使用这种"懒惰"的方法挖掘我的下一个陷阱.
我试图使用精灵工具包在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) 我正在学习DirectX 11的HLSL,我想知道SV_POSITION是什么,它是Vertex Shader的输出,还是Pixel Shader的输入。
1:是屏幕上每个像素或对象的x,y,z?
2:为什么有4个32位浮点数?
3:顶点输出需要这个系统变量吗?
谢谢!
我在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) pixel-shader ×10
hlsl ×6
directx-11 ×3
direct3d ×2
2d ×1
android ×1
c++ ×1
directx ×1
ios ×1
libgdx ×1
opengl ×1
opengl-es ×1
position ×1
resources ×1
silverlight ×1
tessellation ×1