标签: hlsl

HLSL 中的数组长度?

我找不到任何有关如何在 HLSL 中获取数组长度的文档或示例。

我将一组灯光推送到 hlsl 着色器,并且我想做一个for(int i=0; i<foo.length; i++)(-不是正确的语法)。

难道不能获取数组的长度吗?我必须从 C++ 端将数组长度整数推送到 hlsl 着色器吗?

此外,如何找出着色器中允许的最大 for 循环计数是多少?(由于循环是展开的,所以应该有一个限制。)

shader loops hlsl

3
推荐指数
1
解决办法
7656
查看次数

HSLS float1,..., float4 and its fields

I see that HSLS has float and a number after float (1-4) and a lot of fields (r, rr, rrrr, arar,...) (I see these fields with the help of HLSL Tool Thanks to Tim Jones :D - I can't imagine (for now) how can we programming HSLS without this tool).

I try to find references about this data type and its field but I can't find anything about it(why the number 1-4 and the meanings of its fields. In C++ …

hlsl directx-11

3
推荐指数
1
解决办法
3616
查看次数

HLSL #pragma 一次等效?

#pragma onceHLSL 中与 C/C++-like 的等价物是什么?

我想要(作为一个人为的例子):

// ./dependency.hlsl
float x() { return 0; }

// ./shader.hlsl
#include "./dependency.hlsl" // (./ unnecessary; for question readability)
#include "./dependency.hlsl"
Run Code Online (Sandbox Code Playgroud)

不会失败error X3003: redefinition of 'x'#pragma once在我的文件顶部产生一个非错误warning X3568: 'once' : unknown pragma ignored并且什么都不做!

shader direct3d pragma hlsl include

3
推荐指数
1
解决办法
1496
查看次数

如何在Visual Studio中多次编译hlsl着色器?

我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 cso 文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于 DirectX 11,但不适用于 DirectX 9,而“/3_0”仅适用于 DirectX 9,但不适用于在 DirectX 11 上。

向 Visual Studio 项目多次添加相同的文件不起作用,我想避免复制 HLSL 源文件,因为它会增加维护工作量和潜在的错误原因。我也无法在 Visual Studio 中创建单独的目标/配置来实现此目的,因为我需要在可执行文件中支持两个 DirectX 版本(可在运行时切换)。

有没有办法在 Visual Studio 中为单个 HLSL 文件指定多个编译(不同的着色器模型和不同的输出文件)?

hlsl directx-11 directx-9 visual-studio-2017

3
推荐指数
1
解决办法
1690
查看次数

hlsl 中使用的常量缓冲区(cbuffer)究竟是什么?

目前,我的顶点着色器类中有此代码:

cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我需要将这些变量包装在 cbuffer 中。如果我删除缓冲区,我的代码也能正常工作。如果有人能给我一个简短的解释,为什么使用 cbuffers 是必要的,我将不胜感激。

directx buffer constants hlsl

3
推荐指数
1
解决办法
3450
查看次数

Direct3D11:“在循环中使用梯度指令,迭代不同,强制循环展开”,警告:X3570

我正在使用 Direct3D 11 和 Visual Studio 2015 开发图形引擎。在主绘制调用的 HLSL 着色器中,我使用百分比更接近过滤对定向光和点光源的阴影贴图进行采样,即我对周围的小正方形区域进行采样目标阴影贴图 texel 并平均结果以获得软阴影。现在,每次调用 shadowMap_.Sample(...) 都会产生一个警告:“梯度指令在循环中使用不同的迭代,强制循环展开” (X3570)。我想解决这个问题,或者,如果不可能,隐藏警告,因为它完全淹没了我的警告输出。

我尝试在线搜索错误消息,但找不到任何进一步的描述。我什至找不到梯度指令应该是什么的解释。我检查了 Microsoft 文档以获取不同的采样器或采样函数,它可以让我用本机采样功能替换循环,但也没有找到类似的东西。这是我用于对点光源的阴影立方体贴图进行采样的函数:

float getPointShadowValue(in uint index, in float3 worldPosition)
{
    // (Half-)Radius for percentage closer filtering
    int hFilterRadius = 2;

    // Calculate the vector inside the cube that points to the fragment
    float3 fragToLight = worldPosition.xyz - pointEmitters_[index].position.xyz;

    // Calculate the depth of the current fragment
    float currentDepth = length(fragToLight);

    float sum = 0.0;
    for (float z = -hFilterRadius; z <= hFilterRadius; …
Run Code Online (Sandbox Code Playgroud)

directx direct3d hlsl

3
推荐指数
1
解决办法
2480
查看次数

在 HLSL DirectCompute 着色器中实现 SpinLock

我尝试在计算着色器中实现自旋锁。但我的实现似乎没有锁定任何东西。

以下是我实现自旋锁的方法:

void LockAcquire()
{
    uint Value = 1;

    [allow_uav_condition]
    while (Value) {
        InterlockedCompareExchange(DataOutBuffer[0].Lock, 0, 1, Value);
    };
}

void LockRelease()
{
    uint Value;
    InterlockedExchange(DataOutBuffer[0].Lock, 0, Value);
}
Run Code Online (Sandbox Code Playgroud)

背景:我需要一个自旋锁,因为我必须计算大型二维数组中的数据总和。总和是两倍。使用单线程和双循环计算总和会产生正确的结果。即使在计算总和时引入自旋锁以避免冲突,使用多线程计算总和也会产生错误的结果。

我无法使用 InterLockedAdd,因为总和不适合 32 位整数,而且我使用的是着色器模型 5(编译器 47)。

这是单线程版本,产生正确的结果:

[numthreads(1, 1, 1)]
void CSGrayAutoComputeSumSqr(
    uint3 Gid  : SV_GroupID,
    uint3 DTid : SV_DispatchThreadID, // Coordinates in RawImage window
    uint3 GTid : SV_GroupThreadID,
    uint  GI   : SV_GroupIndex)
{
    if ((DTid.x == 0) && (DTid.y == 0)) {
        uint2 XY;
        int   Mean = (int)round(DataOutBuffer[0].GrayAutoResultMean);
        for (XY.x …
Run Code Online (Sandbox Code Playgroud)

directx hlsl spinlock directcompute

3
推荐指数
1
解决办法
2290
查看次数

将 float2/vector2 属性从着色器公开到 Unity 材质检查器

在 Unity Shaderlab 着色器中,您可以向编辑器中的材质检查器公开着色器属性。这可以通过将要公开的属性放置在该Properties部分中来完成,如下所示

Properties
{
    _SomeFloat("A Float", float) = 5
}
Run Code Online (Sandbox Code Playgroud)

Unity 在此处的文档中定义了属性列表。

然而,这不包括任何形式的 float2 或 vector2,只是单个FloatVector由 组成xyzw

我尝试将属性类型设置为float2And Vector2

_SomeFloat("A Float", float2) = (5,5)
_SomeFloat2("A Float2", Vector2) = (5,5)
Run Code Online (Sandbox Code Playgroud)

两者都返回错误Parse error: syntax error, unexpected TVAL_ID at line 7

或者试图Vector通过只设置一半的成员来将其减半

_SomeFloat("A Float", Vector) = (5,5)
Run Code Online (Sandbox Code Playgroud)

返回错误Parse error: syntax error, unexpected ')', expecting ','

我可以只使用 Vector 类型并且只使用它的xy,但这会导致 UI 不清晰,因为检查器中现在有两个未使用的元素,并且找不到允许HideInInspector您隐藏zw值的属性属性或抽屉(例如 …

shader hlsl unity-game-engine shaderlab

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

Spir-v、GLSL 和 HLSL 之间的区别

我试图找出所有着色器语言之间的差异。我正在使用 Vulkan 用 C++ 开发一款游戏,这意味着(如果我没读错的话)我向 Vulkan 提供的每个着色器都必须采用 spir-v 扩展。

但我有时看到这个库的用途:https://github.com/KhronosGroup/SPIRV-Cross 它可以将 spir-v 翻译为其他语言(GLSL、HLSL 或 MSL),当我尝试时它是否有用做一个游戏?不适用于不同平台上的着色器。

或者也许我需要这些不同的格式来使用它们或不同的平台?(这似乎不正确,因为 vulkan 寻找 spir-v)。尽管如此,我看到有一个工具MoltenVK可以在Mac上使用着色器。这意味着 mac 不能正确支持 vulkan?那么这些语言的优点和缺点是什么?(我的意思是在创建游戏时,用户不应该修改着色器)

我希望我的问题不会太模糊。

shader glsl hlsl vulkan spir-v

3
推荐指数
1
解决办法
2719
查看次数

在VS2022中构建像素着色器项目

我有一个旧的类库项目,在以前版本的 Visual Studio (2017 IIRC) 中构建得很好。该项目包含一个基于 HLSL 的像素着色器,可生成径向颜色选择器。我刚刚将它移植到 VS2022,它不再构建,告诉我它找不到构建任务。这是错误消息:

无法从程序集 ShaderBuildTask 加载“ShaderBuildTask.PixelShaderCompile”任务,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125。无法加载文件或程序集“ShaderBuildTask,Version=1.0.3072.18169,Culture=neutral,PublicKeyToken=44e467d1687af125”或其依赖项之一。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项均可用,并且任务包含实现 Microsoft.Build.Framework.ITask.AngularGradientShaderEffect 的公共类

我已经ShaderBuildTaskSetup.msi在我的机器上安装了所需的着色器编译器 ( )。重新加载项目并重新启动 VS 也没有帮助。

有人在 VS2022 中使用像素着色器来看看我缺少什么吗?

hlsl msbuild-task visual-studio fragment-shader

3
推荐指数
1
解决办法
712
查看次数