Questions tagged «hlsl»

由Microsoft开发的一种专有着色语言,用于与Microsoft Direct3D API结合使用。

1
进行平面反射时要考虑波浪
我一直在研究SDK中Nvidia的示例,尤其是Island11项目,并且我发现了一些对HLSL代码感到好奇的东西,该代码根据波高的状态上下校正反射。 自然地,在检查了简短的代码段之后: // calculating correction that shifts reflection up/down according to water wave Y position float4 projected_waveheight = mul(float4(input.positionWS.x,input.positionWS.y,input.positionWS.z,1),g_ModelViewProjectionMatrix); float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; projected_waveheight = mul(float4(input.positionWS.x,-0.8,input.positionWS.z,1),g_ModelViewProjectionMatrix); waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; reflection_disturbance.y=max(-0.15,waveheight_correction+reflection_disturbance.y); 我的第一个猜测是,当它受到垂直扰动(波浪)时,它会补偿平面反射,将反射的几何图形移动到一个什么都没有的位置,而水只是像没有东西或只有天空一样被渲染: 现在,那是天空在反射,我们应该看到该地形的绿色/灰色/黄色反射与水线基线相关的地方。我的问题是,现在我无法真正查明其背后的逻辑是什么。投影波浪/水几何图形的一个点的实际世界空间位置,然后乘以-.5f,仅进行同一点的另一个投影,这一次其y坐标更改为-0.8(为什么是-0.8?)。 代码中的线索似乎表明它是通过反复试验得出的,因为存在冗余。例如,作者采用投影的y坐标的负一半(在w除后): float waveheight_correction=-0.5*projected_waveheight.y/projected_waveheight.w; 然后对第二点做同样的事情(我想只是为了肯定,为了得到某种区别),并将它们结合起来: waveheight_correction+=0.5*projected_waveheight.y/projected_waveheight.w; 通过除以2,我看不出质量改善方面有什么区别(如果有人愿意纠正我,请这样做)。问题的症结似乎是预计y的差异,为什么呢?这种冗余以及-.8f和-0.15f的任意选择使我得出结论,这可能是启发式/猜测式工作的组合。是否有逻辑上的依据,或者只是绝望的破解? 这是代码段修复的初始问题的夸张,在最低细分级别上观察到。希望这可能会引发一个我想念的想法。-.8f可能是一个参考高度,从中可以推断出多少扰动纹理坐标以采样平面反射的几何体渲染,而-.15f可能是下限,这是一种安全措施。

2
随机数hlsl
您如何在HLSL中生成一个随机数? 我问是因为我想尝试gpu射线跟踪。您需要在像素着色器中生成随机方向。所以我想要randFloat(),结果是-1和+1之间的随机数。 另外,hlsl 噪声指令有何处理?文档说它已从HLSL 2.0及更高版本中删除。为什么呢 我读到一种方法,其中用随机值填充纹理,然后在每个具有该纹理索引的顶点中都有一个纹理坐标。但这是每个顶点,我需要一条可以在像素着色器中调用的指令。另外,如果您希望每个帧使用不同的值,则此方法需要“重新播种”每个顶点的texcoord,并且需要每个帧都更新一个顶点缓冲区(这可能很昂贵!) 详细介绍一下,如何便宜地在GPU上生成随机数?
13 hlsl  random  gpu 

2
DirectX11,如何管理和更新多个着色器常量缓冲区?
好吧,我很难理解常量缓冲区如何绑定到流水线阶段并进行更新。我知道DirectX11每阶段最多可以有15个着色器常量缓冲区,每个缓冲区最多可以容纳4096个常量。但是,我不明白用于与常量缓冲区交互的ID3D11Buffer COM是否只是用于填充这些缓冲区插槽的机制(或句柄),还是该对象是否实际引用了来回推送的缓冲区数据的特定实例?在GPU和CPU之间。 我认为我对该主题的困惑是导致我使用两个不同的常量缓冲区的问题的原因。 这是一些示例着色器代码。 cbuffer PerFrame : register(b0) { float4x4 view; }; cbuffer PerObject : register(b1) { float4x4 scale; float4x4 rotation; float4x4 translation; }; 我的代码的组织方式,相机将处理更新相关的每帧数据,而GameObjects将更新其自己的每对象数据。这两个类都有自己的ID3D11Buffer来执行此操作(使用集线器体系结构,因此一个GameObject类将处理世界上所有实例GameObject的呈现)。 问题是我一次只能更新一个,具体取决于插槽,并且我假设一个缓冲区被填充,而另一个缓冲区被填充为零的更新顺序。 这本质上是我的代码。这两个类使用相同的更新逻辑。 static PerObjectShaderBuffer _updatedBuffer; // PerFrameShaderBuffer if Camera class _updatedBuffer.scale = _rScale; _updatedBuffer.rotation = _rRotation; _updatedBuffer.translation = _rTranslation; pDeviceContext->UpdateSubresource(pShaderBuffer, 0 , 0, &_updatedBuffer, 0, …

3
HLSL半透明塑料着色器
我正在尝试制作一个着色器,以复制内部带有彩色光的白色塑料对象。通过具有半透明的着色器,或者如果将光放入对象内部,则该光将显示出来,或者通过具有伪装内部光效果的着色器来实现。 我想要的效果有点像光穿过类似于这些图片的灯罩: 理想情况下,我将能够控制光的强度和颜色,使其发出脉冲并通过一些漂亮的明亮荧光色旋转 虽然我不确定从哪里开始! 我的问题是,是否有人知道我应该研究的技术才能产生这样的着色器,或者有一个我可以用作起点的相同/相似着色器的示例?甚至即使您想提供可以完成此任务的着色器
12 graphics  shaders  hlsl 

1
什么是屏幕空间导数?何时使用它们?
我偶尔看到着色器代码中出现了ddx和ddyglsl函数以及hlsl等效项。我目前正在使用它们来进行不切线或不切线的凹凸贴图,但是我基本上是复制粘贴了代码。我不了解这些功能的实际含义,作用以及何时使用它们。 所以问题: 屏幕空间派生函数是什么? 这些功能做什么?输入值和输出值 它们最常用于什么效果? 什么样的效果需要您关注这些功能?

1
镶嵌与几何着色器
如果我错了,请纠正我,但是“几何着色器”和“细分曲面着色器”作业都将在“图形管线”中生成顶点。我想知道的是它们之间的区别,何时应该在另一个之上使用?

4
HLSL着色器实际上如何最终影响渲染输出?
我了解HLSL的语法,例如,让我们假设我将其作为HLSL: struct VOut { float4 position : SV_POSITION; float4 color : COLOR; }; VOut VShader(float4 position : POSITION, float4 color : COLOR) { VOut output; output.position = position; output.position.xy *= 0.7f; // "shrink" the vertex on the x and y axes output.color = color; return output; } float4 PShader(float4 position …
11 directx  hlsl 

1
多灯快速照明
如何实现多灯快速照明? 我不想束缚玩家,他可以放置无限数量,并且可以在关卡中重叠(点)灯。 问题在于,包含动态循环(用于计算光照)所必需的着色器往往非常慢。 我的想法是,如果有可能在编译时编译一个着色器n次,其中n是光照数量。如果在编译时知道数字n,则可以自动展开循环。是否可以仅使用不同数量的灯光来生成同一着色器的n个版本? 然后,在运行时,我可以决定将哪个着色器用于关卡的哪个部分。


1
2D水顶面轮廓
我正在尝试使用顶点片段着色器创建水表面厚度的效果。 我在3D游戏环境中,但是它是滚动视图,所以是“ 2D”视图。 这是一个使用片段着色器在真实2D中创建这种效果的很好的教程。 但是我认为这不能用于我的情况。目前,我只有一架飞机要折射。 我想应用水厚效果。但是我不知道该怎么做。 我暂时不尝试使用顶点创建一些水变形/位移,这不是重点。 我不知道是否可以使用简单的四边形,也许我应该使用这样的对象。 这里有些例子。 我对如何产生这种效果一无所知。 非常感谢 ! [ 编辑 ]添加了雷曼水效果以更好地参考效果。

3
为什么不能将布尔值打包并对齐到D3D常量缓冲区中?
好吧,我很难将布尔值打包并对齐到hlsl常量缓冲区中,我不确定为什么。 这是hlsl中的缓冲区 cbuffer MaterialBuffer : register(b1) { float3 materialDiffuseAlbedo; float materialSpecularExponent; float3 materialSpecularAlbedo; bool isTextured; }; 这是用c ++编写的 struct GeometryBufferPass_MaterialBuffer { XMFLOAT3 diffuse; float specularExponent; XMFLOAT3 specular; bool isTextured; }; 我试图以各种方式移动布尔并填充结构,但是没有运气。正确的方法是什么?

1
波浪纹波效应?
我从事塔防游戏已有一段时间了,到目前为止,我对结果非常满意。但是,我想补充一件事。 我在这里观看了适用于Windows Phone 7的GeoDefense视频:http : //www.youtube.com/watch?v= YhPr4A4LRPQ 注意如何(当一个单位被杀死或一个弹丸击中一个单位时),背景以某种波效应起伏。 我该如何做一个等价物?我以为我需要以某种方式在顶点着色器中执行此操作,因为它的顶点由许多顶点组成。 你打什么电话 编辑需要特别注意的是,我的XNA游戏不是针对Windows Phone而是针对Windows PC。
9 xna  c#  hlsl 

3
Direct3D纹理采样非常慢
因此,我使用Direct3D 9编写了一个小型游戏,并且针对地形使用了多重纹理。我要做的是对3个纹理和一个混合贴图进行采样,并基于混合贴图的颜色通道从这三个纹理中获取整体颜色。无论如何,当我对1个以上的纹理进行采样时,我的帧速率会大幅下降,我将从120+ fps降至不到50 fps。 这是造成速度下降的HLSL代码: float3 ground = tex2D(GroundTex, multiTex).rgb; float3 stone = tex2D(StoneTex, multiTex).rgb; float3 grass = tex2D(GrassTex, multiTex).rgb; float3 blend = tex2D(BlendMapTex, blendMap).rgb; 我做错了吗?如果任何人有任何有关纹理采样的信息或技巧,那都很好。 谢谢。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.