我有两个纹理和一个纹理数组。我试图将两个纹理绑定到 t1,将纹理数组绑定到 t2。hlsl 可能喜欢这个
Texture2D gDiffuseMap : register(t0);
Texture2DArray gDiffuseMaps : register(t1);
Run Code Online (Sandbox Code Playgroud)
我创建了一个有 2 个描述符的描述符范围。
CD3DX12_DESCRIPTOR_RANGE texTable;
texTable.Init(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 2, 0);
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将描述符绑定到寄存器。
当我编译HLSL着色器pow(foo, 6)或者pow(foo, 8),编译器创建具有比如果我创建相同的着色器约10多指令集会pow(foo, 9)或pow(foo,10)或pow(foo,7).
这是为什么?
我正在尝试创建一个景深后期处理,但不知道从哪里开始(除了渲染深度图,我目前正在).它的所有教程都是针对XNA3.1,实际上没有给你解释,或者是书的一部分.
那么,您是否可以通过详细的逐步过程来了解DOF的呈现方式?
我正在尝试在HLSL文件中定义一个简单的SamplerState以用于纹理.编译着色器时,出现错误:
error X3004: undeclared identifier 'Filter'
Run Code Online (Sandbox Code Playgroud)
资源:
// part of render.hlsl
SamplerState linear_sample=
{
Filter=MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
Run Code Online (Sandbox Code Playgroud)
汇编:
hr=D3DX10CreateEffectFromFile("render.hlsl",NULL,NULL,"fx_4_0",D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_DEBUG,0,dx_device,NULL,NULL,&dx_effect,&dx_err,NULL);'
Run Code Online (Sandbox Code Playgroud)
我已经在MSDN上查看了,我的HLSL文件似乎没有任何问题.我编译不正确吗?
我正在阅读Frank D. Luna的DirectX 11 3D游戏编程简介,似乎无法理解我们为什么要在Pixel Shader中实现照明?如果你能给我发一些关于这个主题的参考页面,我将不胜感激.
谢谢.
在 HLSL 中,我将如何以最佳精度将 0-1 范围内的两个浮点数打包成一个浮点数。这对于进一步压缩我的 GBuffer 非常有用。
在 github 上找到了一个带有着色器的 Unity 软体资源。由于对Unity着色器的了解有限,我不知道上述错误是什么意思。
代码(第22行是发生错误的地方,我已经标记了。):
Shader "Custom/Circle" {
Properties {
_Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert_img
#pragma fragment frag
#pragma target 3.0
float4 _Color;
float4 frag(v2f_img i): COLOR {
fixed4 transparent = float4(float3(_Color),0); // << ERROR IS HERE >>
float distance = length(i.uv - float2(0.5, 0.5));
float delta = fwidth(distance);
float alpha = smoothstep(0.5, 0.5 - delta, …Run Code Online (Sandbox Code Playgroud) 我试图将值0转换为1和1转换为-1,但不使用if语句.我试着做一些数学运算来将它映射到一个新的范围,但我无法为这两个参数做到这一点.
这可行吗?
它必须在没有集合中的硬编码值的情况下执行此操作,例如:
initial = 0 or 1;
final_value = (initial + 1) * -1;
Run Code Online (Sandbox Code Playgroud)
因此,最终值将根据初始值映射到1或-1,使用相同的等式.
编辑:我基本上试图摆脱if声明,因为这是着色器代码和我的朋友在工作(着色程序员)说if声明减慢了执行速度所以最好统一做事.不确定它是否有意义.