1

我想知道如何确定 HLSL 中方法 cross 的方向。我的意思是在 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); 结果很好。所以,我不明白为什么要用look来交叉,结果是正确的向量。

4

2 回答 2

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),我相信它最终会变成黑色。

于 2013-11-01T15:00:07.843 回答
0

叉积只有一个数学定义,因此完全取决于上下文。如果在右手坐标系中解释,则结果向量的方向将遵循右手法则,如果在左手坐标系中解释,则遵循左手法则。您只需要知道坐标系的惯用手(在使用 Direct3D 时通常是左手,但不一定)。

看到这个问题

于 2013-11-01T15:13:14.313 回答