我找不到任何有关如何在 HLSL 中获取数组长度的文档或示例。
我将一组灯光推送到 hlsl 着色器,并且我想做一个for(int i=0; i<foo.length; i++)(-不是正确的语法)。
难道不能获取数组的长度吗?我必须从 C++ 端将数组长度整数推送到 hlsl 着色器吗?
此外,如何找出着色器中允许的最大 for 循环计数是多少?(由于循环是展开的,所以应该有一个限制。)
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++ …
#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并且什么都不做!
我已将 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 文件指定多个编译(不同的着色器模型和不同的输出文件)?
目前,我的顶点着色器类中有此代码:
cbuffer MatrixBuffer {
matrix worldMatrix;
matrix viewMatrix;
matrix projectionMatrix; };
Run Code Online (Sandbox Code Playgroud)
我不知道为什么我需要将这些变量包装在 cbuffer 中。如果我删除缓冲区,我的代码也能正常工作。如果有人能给我一个简短的解释,为什么使用 cbuffers 是必要的,我将不胜感激。
我正在使用 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) 我尝试在计算着色器中实现自旋锁。但我的实现似乎没有锁定任何东西。
以下是我实现自旋锁的方法:
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) 在 Unity Shaderlab 着色器中,您可以向编辑器中的材质检查器公开着色器属性。这可以通过将要公开的属性放置在该Properties部分中来完成,如下所示
Properties
{
_SomeFloat("A Float", float) = 5
}
Run Code Online (Sandbox Code Playgroud)
Unity 在此处的文档中定义了属性列表。
然而,这不包括任何形式的 float2 或 vector2,只是单个Float或Vector由 组成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值的属性属性或抽屉(例如 …
我试图找出所有着色器语言之间的差异。我正在使用 Vulkan 用 C++ 开发一款游戏,这意味着(如果我没读错的话)我向 Vulkan 提供的每个着色器都必须采用 spir-v 扩展。
但我有时看到这个库的用途:https://github.com/KhronosGroup/SPIRV-Cross 它可以将 spir-v 翻译为其他语言(GLSL、HLSL 或 MSL),当我尝试时它是否有用做一个游戏?不适用于不同平台上的着色器。
或者也许我需要这些不同的格式来使用它们或不同的平台?(这似乎不正确,因为 vulkan 寻找 spir-v)。尽管如此,我看到有一个工具MoltenVK可以在Mac上使用着色器。这意味着 mac 不能正确支持 vulkan?那么这些语言的优点和缺点是什么?(我的意思是在创建游戏时,用户不应该修改着色器)
我希望我的问题不会太模糊。
我有一个旧的类库项目,在以前版本的 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 中使用像素着色器来看看我缺少什么吗?