我一直在阅读很多关于延迟着色的内容,并希望尝试进入它.问题是我找不到一个示例,它演示了延迟阴影如何同时支持这么多灯光 - 我发现一个演示非常简单,在Code Sampler和nVidia HDR示例中只有一个灯光,但除此之外没什么.
有谁知道我应该去哪里一个很好的入门教程(带代码)如何使用照明去除阴影?我可以用一盏灯工作,但一盏灯太简单了(很明显:P).此外,我只知道如何在延迟着色代码中制作方向灯,这是一个很好的dall,但有点不同于渲染灯的常规方式,所以我想知道是否有wree教程或我能找到的任何东西或只是阅读材料,这将有助于我弄清楚如何在延迟渲染中编写着色器和特殊fx?
谢谢你的帮助!
在HLSL中有很多矩阵乘法,虽然我理解如何以及在何处使用它们但我不确定它们是如何派生出来的或它们的实际目标是什么.
所以我想知道是否有在线资源可以解释这一点,我特别好奇是通过投影矩阵将世界矩阵乘以视图矩阵和世界+视图矩阵背后的目的是什么.
我正在寻找一些用于编写2D着色器的资源(不是 3D,所以请不要引用顶点着色器代码或类似的东西).我正在使用HLSL,但在寻找好的教程方面遇到了很多麻烦.
有什么建议?
我正在使用SlimDX,使用着色器模型4定位DirectX 11.我有一个像素着色器"preProc",它处理我的顶点并保存三种数据纹理.一个用于每像素法线,一个用于每像素位置数据,一个用于颜色和深度(颜色占用rgb和深度采用alpha通道).
然后,我在后处理着色器中使用这些纹理以实现屏幕空间环境遮挡,但似乎没有数据在第一个着色器中保存.
这是我的像素着色器:
PS_OUT PS( PS_IN input )
{
PS_OUT output;
output.col = float4(0,0,0,0);
output.norm = float4(input.norm,1);
output.pos = input.pos;
return output;
}
Run Code Online (Sandbox Code Playgroud)
它输出以下结构:
struct PS_OUT
{
float4 col : SV_TARGET0;
float4 norm : SV_TARGET1;
float4 pos : SV_TARGET2;
};
Run Code Online (Sandbox Code Playgroud)
并采用以下结构进行输入:
struct PS_IN
{
float4 pos : SV_POSITION;
float2 tex : TEXCOORD0;
float3 norm : TEXCOORD1;
};
Run Code Online (Sandbox Code Playgroud)
但是在我的后期处理着色器中:
Texture2D renderTex : register(t1);
Texture2D normalTex : register(t2);
Texture2D positionTex : register(t3);
Texture2D randomTex : register(t4);
SamplerState samLinear : register(s0);
float4 …Run Code Online (Sandbox Code Playgroud) 我正在为我的基于XNA 2D磁贴的游戏添加照明.
我发现这篇文章很有用,但它完成它的方式不支持碰撞.我想要的是一种方法来做到以下几点
我一直在寻找相当长的一段时间但没有运气(我确实找到了Catalin的教程,但它对我来说似乎有点先进,并且由于重新绘制了每个点的整个游戏而不适用于瓷砖)
我有一个像素着色器,我想根据我的世界空间坐标来计算每个像素的位置。我该怎么做?我需要什么?
我有一个ps_input具有float4位置的结构:SV_POSITION。我假设这很重要,但是存储在里面的值似乎有点可笑。
我似乎无法弄清楚它们之间的关系。例如,如果一个像素是2d,那么为什么它具有w分量或z分量呢?
我正在使用DirectX,并且像素着色器在中HLSL。C++作为我在CPU上的编程语言。
任何帮助,将不胜感激。
我是HLSL和着色器的新手。我似乎无法替换检索到的颜色。用于2D文本,即字幕。问题是如果我在main()外部设置osd_color,它什么也不会显示。我正在使用Shazzam Shader Editor 1.4快速查看效果,但是程序中也会发生同样的情况。
sampler2D texture0 : register(s0);
float4 osd_color = float4(0,0,0,1);
struct PixelShaderInput
{
float2 uv0: TEXCOORD0;
float4 color: COLOR;
};
float4 main(PixelShaderInput input): COLOR {
float4 color = tex2D(texture0, input.uv0) * osd_color;
return color;
}
Run Code Online (Sandbox Code Playgroud)
希望能对您有所帮助。
编辑:
当我在使用它时,如果我想添加阴影/轮廓并返回其颜色,该怎么办?假设每个变量都有效。osd_color是白色,float4轮廓是黑色。我试过了:
float4 outline = tex2D(texture0, (input.uv0 * 1.1) ) * outline_color;
return color + outline;
Run Code Online (Sandbox Code Playgroud)
这样,我得到的是白色(osd_color)。
我有一个像素着色器应该只是通过输入颜色,但我得到一个恒定的结果.我认为我的语法可能是问题所在.这是着色器:
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) 我有一个问题,下面的像素着色器(HLSL)编译为68条指令(使用下面建议的优化).但是,我想将它与着色器模型2一起使用,因此遗憾的是我最多只能使用64条指令.有没有人在不改变着色器结果的情况下看到任何可能的优化?
着色器将屏幕的一个或多或少的球形区域(具有正弦形边界)从RGB转换为白色 - >红色 - >黑色的渐变,并具有一些额外的亮度等修改.
着色器代码是:
// Normalized timefactor (1 = fully enabled)
float timeFactor;
// Center of "light"
float x;
float y;
// Size of "light"
float viewsizeQ;
float fadesizeQ;
// Rotational shift
float angleShift;
// Resolution
float screenResolutionWidth;
float screenResolutionHeight;
float screenZoomQTimesX;
// Texture sampler
sampler TextureSampler : register(s0);
float4 method(float2 texCoord : TEXCOORD0) : COLOR0
{
// New color after transformation
float4 newColor;
// Look up the texture color.
float4 color = …Run Code Online (Sandbox Code Playgroud) 使用DirectX 11,我创建了一个可以绑定为渲染目标的3D体积纹理:
D3D11_TEXTURE3D_DESC texDesc3d;
// ...
texDesc3d.Usage = D3D11_USAGE_DEFAULT;
texDesc3d.BindFlags = D3D11_BIND_RENDER_TARGET;
// Create volume texture and views
m_dxDevice->CreateTexture3D(&texDesc3d, nullptr, &m_tex3d);
m_dxDevice->CreateRenderTargetView(m_tex3d, nullptr, &m_tex3dRTView);
Run Code Online (Sandbox Code Playgroud)
我现在想要更新整个渲染目标并用像素着色器中生成的程序数据填充它,类似于使用"全屏通道"更新2D渲染目标.生成数据所需的一切都是所讨论像素的UVW坐标.
对于2D,可以构建渲染全屏三角形的简单顶点着色器:
struct VS_OUTPUT
{
float4 position : SV_Position;
float2 uv: TexCoord;
};
// input: three empty vertices
VS_OUTPUT main( uint vertexID : SV_VertexID )
{
VS_OUTPUT result;
result.uv = float2((vertexID << 1) & 2, vertexID & 2);
result.position = float4(result.uv * float2(2.0f, -2.0f) + float2(-1.0f, 1.0f), 0.0f, 1.0f);
return result;
}
Run Code Online (Sandbox Code Playgroud)
我很难绕过如何采用3D原理.这是即使在DirectX 11的可能,还是我的描述来呈现给卷纹理的个体片在这里?
hlsl ×10
directx ×4
pixel-shader ×4
2d ×2
shader ×2
xna ×2
3d-texture ×1
c# ×1
c++ ×1
colors ×1
direct3d ×1
directx-11 ×1
graphics ×1
lighting ×1
math ×1
matrix ×1
optimization ×1
position ×1
rendering ×1
rendertarget ×1
resources ×1
slimdx ×1
variables ×1