gpt4 book ai didi

matrix - glsl 向量*矩阵与 hlsl 不同

转载 作者:行者123 更新时间:2023-12-01 00:58:56 25 4
gpt4 key购买 nike

我有两个(相同的)着色器,一个在 hlsl 中,一个在 glsl 中。在像素着色器中,我将向量乘以矩阵进行法线变换。
代码本质上是:

HLSL

float3 v = ...;
float3x3 m = ...;
float3 n = mul(v, m);

GLSL
vec3 v = ...;
mat3 m = ...;
vec3 n = v * m;

这应该进行行向量乘法,但在 glsl 中却没有。如果我明确输入算法,它对两者都适用。
glsl 和 hlsl 规范,据我所知,如果向量在左侧,他们应该做一个行向量乘法,它是。

另一个令人困惑的事情是,我将顶点着色器中的向量与左侧的向量相乘,但在 glsl 和 hlsl 中都可以正常工作。这让我猜测这只是片段/像素着色器中的一个问题。

我使用以下方法将矩阵从顶点着色器传递到片段着色器:
out vec3 out_vs_TangentToWorldX;
out vec3 out_vs_TangentToWorldY;
out vec3 out_vs_TangentToWorldZ;

out_vs_TangentToWorldX = tangent * world3D;
out_vs_TangentToWorldY = binormal * world3D;
out_vs_TangentToWorldZ = normal * world3D;

在片段着色器中,我用以下方法重建它:
in vec3 out_vs_TangentToWorldX;
in vec3 out_vs_TangentToWorldY;
in vec3 out_vs_TangentToWorldZ;

mat3 tangentToWorld;
tangentToWorld[0] = out_vs_TangentToWorldX;
tangentToWorld[1] = out_vs_TangentToWorldY;
tangentToWorld[2] = out_vs_TangentToWorldZ;

最佳答案

HLSL 矩阵是行优先的,GLSL 是列优先的。因此,如果您使用与传递到 HLSL 相同的内存布局将矩阵传递到 GLSL 着色器,那么您的 HLSL 行将成为 GLSL 列。并且您应该在 GLSL 着色器中使用列主乘法以获得与 HLSL 相同的效果。

只需使用

vec3 n = m * v;

关于matrix - glsl 向量*矩阵与 hlsl 不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25229567/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com