Getting a weird shader error: error X3018: invalid subscript 'xyz'

Started by
3 comments, last by BCullis 11 years, 7 months ago
I get error X3018: invalid subscript 'xyz' when I try to compile my vertex shader.Here is my shader code:


cbuffer PerFrameConstants : register(b0)
{
float4x4 worldViewProjectionMatrix;
float4x4 worldViewMatrix;
float4x4 viewProjectionMatrix;
float4x4 projectionMatrix;
float4 cameraNearFar;
uint4 framebufferDimensions;
float tessellationFactor;
float3 padding;
};

struct GeometryVSIn
{
float3 position : position;
float3 normal : normal;
float2 texCoord : texCoord;
float3 instancePosition : instancePosition;
float3 instanceRotation : instanceRotation;
};
struct GeometryVSOut
{
float4 position : SV_Position;
float3 positionView : positionView;
float3 normal : normal;
float2 texCoord : texCoord;
};


float4x4 RotateV2M(float3 rotation)
{
float4x4 rotateX = { 1.0f, 0.0f, 0.0f, 0.0f,
0.0f, cos(rotation.x), -sin(rotation.x), 0.0f,
0.0f, sin(rotation.x), cos(rotation.x), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
float4x4 rotateY = { cos(rotation.y), 0.0, sin(rotation.y), 0.0f,
0.0f, 1.0f, 0.0f, 0.0f,
-sin(rotation.y), 0.0, cos(rotation.y), 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
float4x4 rotateZ = { cos(rotation.z), -sin(rotation.z), 0.0f, 0.0f,
sin(rotation.z), cos(rotation.z), 0.0f, 0.0f,
0.0f, 0.0f, 1.0f, 0.0f,
0.0f, 0.0f, 0.0f, 1.0f };
return mul(rotateY, mul(rotateX, rotateZ));
}

GeometryVSOut GeometryVS(GeometryVSIn input)
{
GeometryVSOut output;
output.position.x += input.instancePosition.x;
output.position.y += input.instancePosition.y;
output.position.z += input.instancePosition.z;
float4x4 rotationMatrix = RotateV2M(input.instanceRotation);
output.position = mul(float4(input.position, 1.0f), mul(worldViewProjectionMatrix, rotationMatrix));
output.positionView = mul(float4(input.position, 1.0f), mul(worldViewMatrix, rotationMatrix).xyz;
output.normal = mul(float4(input.normal, 0.0f), mul(worldViewMatrix, rotationMatrix)).xyz;
output.texCoord = input.texCoord;

return output;
}






So the problem is in the last function(the main vertex shader one),it somehow has trouble converting from float3 to float4 I think,I'm actualy new to the .xyz functionality,I think it's called swizzling.Maybe I'm not implementing the swizzling properly?
Advertisement
There is a syntax error in this row:

output.positionView = mul(float4(input.position, 1.0f), mul(worldViewMatrix, rotationMatrix).xyz;

As a hint, the error is not related to the swizzle itself.

Niko Suni


There is a syntax error in this row:

output.positionView = mul(float4(input.position, 1.0f), mul(worldViewMatrix, rotationMatrix).xyz;

As a hint, the error is not related to the swizzle itself.


Thanks,I can't believe I missed that one,however I think there is still some problem with the actual vertex declaration,or I'm not doing the C++ side right:

UINT shaderFlags = D3D10_SHADER_ENABLE_STRICTNESS | D3D10_SHADER_PACK_MATRIX_ROW_MAJOR;
ID3D10Blob *bytecode = 0;
HR(D3DX11CompileFromFile(L"GeometryVS.hlsl", defines, 0, "GeometryVS", "vs_5_0", shaderFlags, 0, 0, &bytecode, 0, 0));
const D3D11_INPUT_ELEMENT_DESC polygonLayout[] =
{
{"position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"normal", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"texCoord", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 24, D3D11_INPUT_PER_VERTEX_DATA, 0},
{"instancePosition", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D11_INPUT_PER_INSTANCE_DATA, 0},
{"instanceRotation", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 12, D3D11_INPUT_PER_INSTANCE_DATA, 0},
};

HR(gD3DDevice->CreateInputLayout(polygonLayout, ARRAYSIZE(polygonLayout), bytecode->GetBufferPointer(), bytecode->GetBufferSize(), &vertexLayout));
gD3DImmediateContext->IASetInputLayout(vertexLayout);
SafeRelease(bytecode);


I saw in a tutorial that you define the first 3 ones like this and the ''AlignedByteOffset'' was '0' for the first one, '12' for the second and '24' for the third,even tho the third(texcoord-2 elements) is smaller than the second(position-3 elements) and yet theyre both 12 bytes apart,so I'm confused-should I put the instance ones 12 bytes apart too for it to work with the above shader?
The instance data is (likely) in a separate vertex stream. In the input element descriptions, you still say that they are in the first stream (the InputSlot field of the structure).

The offsets are correct.

Niko Suni


I saw in a tutorial that you define the first 3 ones like this and the ''AlignedByteOffset'' was '0' for the first one, '12' for the second and '24' for the third,even tho the third(texcoord-2 elements) is smaller than the second(position-3 elements) and yet theyre both 12 bytes apart,so I'm confused


Offset is calculated from the end of the previous element, it's not related to the current element you're declaring. If I have a 12 byte element, a 12 byte element, and an 8 byte element in that order:
- the first offset is 0 (since it's first in the list),
- the second is (previous offset ((0)) + length of previous element((12))), so 12,
- the third is (previous offset ((12)) + length of previous element ((12))), so 24.
if there had been a fourth element in the same stream, THEN you would have seen the 8-byte alignment make a difference in an offset value, as the next up would be 32.

Hazard Pay :: FPS/RTS in SharpDX (gathering dust, retained for... historical purposes)
DeviantArt :: Because right-brain needs love too (also pretty neglected these days)

This topic is closed to new replies.

Advertisement