Support and test 1D and 3D textures in HLSL4/5

This commit is contained in:
Robert Konrad 2017-04-21 14:05:17 +02:00
parent 23d993546c
commit 9020c48076
3 changed files with 80 additions and 20 deletions

View File

@ -1,12 +1,20 @@
Texture2D<float4> tex;
SamplerState _tex_sampler;
Texture1D<float4> tex1d;
SamplerState _tex1d_sampler;
Texture2D<float4> tex2d;
SamplerState _tex2d_sampler;
Texture3D<float4> tex3d;
SamplerState _tex3d_sampler;
static float2 texCoord;
static float texCoord1d;
static float2 texCoord2d;
static float3 texCoord3d;
static float4 FragColor;
struct SPIRV_Cross_Input
{
float2 texCoord : TEXCOORD0;
float texCoord1d : TEXCOORD0;
float2 texCoord2d : TEXCOORD1;
float3 texCoord3d : TEXCOORD2;
};
struct SPIRV_Cross_Output
@ -31,18 +39,32 @@ float3 SPIRV_Cross_projectTextureCoordinate(float4 coord)
void frag_main()
{
float4 texcolor = tex.Sample(_tex_sampler, texCoord);
texcolor += tex.Sample(_tex_sampler, texCoord, int2(1, 2));
texcolor += tex.SampleLevel(_tex_sampler, texCoord, 2.0f);
texcolor += tex.SampleGrad(_tex_sampler, texCoord, float2(1.0f, 2.0f), float2(3.0f, 4.0f));
texcolor += tex.Sample(_tex_sampler, SPIRV_Cross_projectTextureCoordinate(float3(texCoord, 2.0f)));
texcolor += tex.SampleBias(_tex_sampler, texCoord, 1.0f);
float4 texcolor = tex1d.Sample(_tex1d_sampler, texCoord1d);
texcolor += tex1d.Sample(_tex1d_sampler, texCoord1d, 1);
texcolor += tex1d.SampleLevel(_tex1d_sampler, texCoord1d, 2.0f);
texcolor += tex1d.SampleGrad(_tex1d_sampler, texCoord1d, 1.0f, 2.0f);
texcolor += tex1d.Sample(_tex1d_sampler, SPIRV_Cross_projectTextureCoordinate(float2(texCoord1d, 2.0f)));
texcolor += tex1d.SampleBias(_tex1d_sampler, texCoord1d, 1.0f);
texcolor += tex2d.Sample(_tex2d_sampler, texCoord2d);
texcolor += tex2d.Sample(_tex2d_sampler, texCoord2d, int2(1, 2));
texcolor += tex2d.SampleLevel(_tex2d_sampler, texCoord2d, 2.0f);
texcolor += tex2d.SampleGrad(_tex2d_sampler, texCoord2d, float2(1.0f, 2.0f), float2(3.0f, 4.0f));
texcolor += tex2d.Sample(_tex2d_sampler, SPIRV_Cross_projectTextureCoordinate(float3(texCoord2d, 2.0f)));
texcolor += tex2d.SampleBias(_tex2d_sampler, texCoord2d, 1.0f);
texcolor += tex3d.Sample(_tex3d_sampler, texCoord3d);
texcolor += tex3d.Sample(_tex3d_sampler, texCoord3d, int3(1, 2, 3));
texcolor += tex3d.SampleLevel(_tex3d_sampler, texCoord3d, 2.0f);
texcolor += tex3d.SampleGrad(_tex3d_sampler, texCoord3d, float3(1.0f, 2.0f, 3.0f), float3(4.0f, 5.0f, 6.0f));
texcolor += tex3d.Sample(_tex3d_sampler, SPIRV_Cross_projectTextureCoordinate(float4(texCoord3d, 2.0f)));
texcolor += tex3d.SampleBias(_tex3d_sampler, texCoord3d, 1.0f);
FragColor = texcolor;
}
SPIRV_Cross_Output main(SPIRV_Cross_Input stage_input)
{
texCoord = stage_input.texCoord;
texCoord1d = stage_input.texCoord1d;
texCoord2d = stage_input.texCoord2d;
texCoord3d = stage_input.texCoord3d;
frag_main();
SPIRV_Cross_Output stage_output;
stage_output.FragColor = FragColor;

View File

@ -1,16 +1,36 @@
#version 450
uniform sampler2D tex;
in vec2 texCoord;
uniform sampler1D tex1d;
uniform sampler2D tex2d;
uniform sampler3D tex3d;
in float texCoord1d;
in vec2 texCoord2d;
in vec3 texCoord3d;
out vec4 FragColor;
void main() {
vec4 texcolor = texture(tex, texCoord);
texcolor += textureOffset(tex, texCoord, ivec2(1, 2));
texcolor += textureLod(tex, texCoord, 2);
texcolor += textureGrad(tex, texCoord, vec2(1.0, 2.0), vec2(3.0, 4.0));
texcolor += textureProj(tex, vec3(texCoord, 2.0));
texcolor += texture(tex, texCoord, 1.0);
vec4 texcolor = texture(tex1d, texCoord1d);
texcolor += textureOffset(tex1d, texCoord1d, 1);
texcolor += textureLod(tex1d, texCoord1d, 2);
texcolor += textureGrad(tex1d, texCoord1d, 1.0, 2.0);
texcolor += textureProj(tex1d, vec2(texCoord1d, 2.0));
texcolor += texture(tex1d, texCoord1d, 1.0);
texcolor += texture(tex2d, texCoord2d);
texcolor += textureOffset(tex2d, texCoord2d, ivec2(1, 2));
texcolor += textureLod(tex2d, texCoord2d, 2);
texcolor += textureGrad(tex2d, texCoord2d, vec2(1.0, 2.0), vec2(3.0, 4.0));
texcolor += textureProj(tex2d, vec3(texCoord2d, 2.0));
texcolor += texture(tex2d, texCoord2d, 1.0);
texcolor += texture(tex3d, texCoord3d);
texcolor += textureOffset(tex3d, texCoord3d, ivec3(1, 2, 3));
texcolor += textureLod(tex3d, texCoord3d, 2);
texcolor += textureGrad(tex3d, texCoord3d, vec3(1.0, 2.0, 3.0), vec3(4.0, 5.0, 6.0));
texcolor += textureProj(tex3d, vec4(texCoord3d, 2.0));
texcolor += texture(tex3d, texCoord3d, 1.0);
FragColor = texcolor;
}

View File

@ -1337,7 +1337,25 @@ void CompilerHLSL::emit_uniform(const SPIRVariable &var)
if (options.shader_model >= 40 && type.basetype == SPIRType::SampledImage)
{
auto &imagetype = get<SPIRType>(type.image.type);
statement("Texture2D<", type_to_glsl(imagetype), "4> ", to_name(var.self), ";");
string dim;
switch (type.image.dim)
{
case Dim1D:
dim = "1D";
break;
case Dim2D:
dim = "2D";
break;
case Dim3D:
dim = "3D";
break;
case DimCube:
case DimRect:
case DimBuffer:
case DimSubpassData:
SPIRV_CROSS_THROW("Cube/Buffer texture support is not yet implemented for HLSL"); // TODO
}
statement("Texture", dim, "<", type_to_glsl(imagetype), "4> ", to_name(var.self), ";");
statement("SamplerState _", to_name(var.self), "_sampler;");
}
else