方法交叉在HLSL中是如何做的
How method cross do in HLSL?
我想知道如何确定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); 结果很好。所以,我不明白为什么要用外观向上交叉,结果是正确的向量。
此方法并非特定于 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),我相信它最终是黑色的。
叉积只有一个数学定义,所以这一切都取决于上下文。如果在右手坐标系中解释,则生成的矢量的方向将遵循右手规则;如果在左手坐标系中解释,则遵循左手规则。你只需要知道坐标系的惯用手(使用 Direct3D 时通常是左撇子,但不一定)。
看到这个问题。
- #定义c-预处理器常量..我做错了什么
- 努力将整数转换为链表。不知道我在这里做错了什么
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 我想做一个彼此不同但重复出现的数字
- Python中的for循环与C++有何不同
- 我可以做些什么来消除或最小化这种将提供相同功能和行为的代码重复
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 排序时无法执行交换操作.我做的时候它会崩溃.为什么
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么C++的文件 I/O 在读取文本文件时忽略初始空行?我怎样才能让它不这样做?
- .h 和.cpp文件分离时出错,但仅使用 .h 文件时没有错误.我做错了什么?
- 当我们为(;;) 写作时,它做了什么?for 循环中的双分号有什么作用?
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 为什么在C++中对链表这样做?(像堆叠一样处理它们)
- 我的C++线程做错了什么?
- 我不知道这条线是做什么的
- 这个模板在做什么?
- "delete"在 C++ 中实际上做了什么?
- 方法交叉在HLSL中是如何做的
- HLSL中的printf函数做什么?