我想知道如何确定HLSL中方法交叉的方向。我的意思是在OpenGL中,我们可以使用右手规则来获得结果,而在direct3d中我们可以使用左手规则。 这是事情,我们使用哪个规则来获得HLSL中结果的方向? 感谢大家 。这是事情,这一天我正在研究3D技术,当我用广告牌进行锻炼时,我遇到了一个问题。在本书的第12章中,有关于广告牌的练习,作者给出了实现广告牌的顶点着色器的示例。这是代码:
OutputVS AABillBoardVS(
float3 posL : POSITION0,
float3 bbOffset : TEXCOORD0, // Offsets to world space position.
float2 tex0: TEXCOORD1)
{
// Zero out our output.
OutputVS outVS = (OutputVS)0;
// Vertex world position without rotation applied to make
// face the camera.
float3 tempPosW = posL + bbOffset;
float3 look = gEyePosW - tempPosW;
look.y = 0.0f; // axis-aligned, so keep look in xz-plane.
look = normalize(look);
float3 up = float3(0.0f, 1.0f, 0.0f);
float3 right = cross(up, look);
// Rotate to make face the camera.
float3x3 R;
R[0] = right;
R[l] = up;
R[2] = look;
// Offset to world position.
float3 posW = mul(posL, R) + bbOffset;
// Transform to homogeneous clip space.
outVS.posH = mul(float4(posW, 1.0f), gViewProj);
// Pass on texture coordinates to be interpolated in
// rasterization.
outVS.tex0 = tex0;
// Done--return the output.
return outVS;
}
当我使用上面的代码时,它没有用。所以我检查了一下,并将右向量的计算更改为 float3 right = cross(look,up); ,结果很好。所以,我不明白为什么使用外观交叉,结果是正确的向量。
答案 0 :(得分:0)
此方法并非特定于OpenGL或GLSL,但您可以使用相同的原则。首先,我几乎肯定HLSL遵循DirectX并且是左撇子。但是,您可以通过进行测试来确定它遵循的规则。
在GLSL中,您可以通过将片段颜色设置为等于矢量来“打印”矢量。然后只考虑片段的颜色分量,你就知道了矢量等于什么。换句话说,一个实心的红色碎片意味着vect等于(1,0,0)而xyz直接映射到rgb。
考虑到这一点,如果在着色器中创建两个向量,将它们交叉,并将结果向量“打印”到片段,您可以通过输出告诉HLSL遵循的规则。
例如:
Vect vec1Red(1,0,0);
Vect vec2Green(0,1,0);
Vect vec3Output = cross(vec1Red, vec2Green);
GLFragColor = vec4(vec3Output.xyz,1);
如果打印出来的颜色是蓝色,则表示矢量等于(0,0,1)并且它遵循右手规则。否则它将等于(0,0,-1),我相信最终会变成黑色。
答案 1 :(得分:0)
交叉产品只有一个数学定义,所以这一切都取决于上下文。如果在右手坐标系中解释,则得到的矢量的方向将遵循右手规则,如果在左手坐标系中解释,则左手规则将遵循左手规则。你只需要知道你的坐标系的手性(当使用Direct3D时通常是左撇子,但不一定)。
请参阅this question。