gpt4 book ai didi

opengl - 在 FragmentShader 中计算切线空间

转载 作者:行者123 更新时间:2023-12-04 04:54:20 25 4
gpt4 key购买 nike

我想计算 GLSL 中的切线空间。

这是我的代码中的重要部分:

// variables passed from vertex to fragment program //
in vec3 vertexNormal;
in vec2 textureCoord;
in vec3 lightPosition;
in vec3 vertexPos;
in mat4 modelView;
in mat4 viewMatrix;

// TODO: textures for color and normals //
uniform sampler2D normal;
uniform sampler2D texture;


// this defines the fragment output //
out vec4 color;

void main() {
// ###### TANGENT SPACE STUFF ############
vec4 position_eye = modelView * vec4(vertexPos,1.0);
vec3 q0 = dFdx(position_eye.xyz);
vec3 q1 = dFdy(position_eye.xyz);
vec2 st0 = dFdx(textureCoord.st);
vec2 st1 = dFdy(textureCoord.st);

float Sx = ( q0.x * st1.t - q1.x * st0.t) / (st1.t * st0.s - st0.t * st1.s);
float Tx = (-q0.x * st1.s + q1.x * st0.s) / (st1.t * st0.s - st0.t * st1.s);

q0.x = st0.s * Sx + st0.t * Tx;
q1.x = st1.s * Sx + st1.t * Tx;

vec3 S = normalize( q0 * st1.t - q1 * st0.t);
vec3 T = normalize(-q0 * st1.s + q1 * st0.s);

vec3 n = texture2D(normal,textureCoord).xyz;
n = smoothstep(-1,1,n);

mat3 tbn = (mat3(S,T,n));

// #######################################

n = tbn * n; // transfer the read normal to worldSpace;


vec3 eyeDir = - (modelView * vec4(vertexPos,1.0)).xyz;

vec3 lightDir = (modelView * vec4(lightPosition.xyz, 1.0)).xyz;

在此代码之后有一个 phong 着色,它将与纹理混合。将着色器应用于没有 normalMapping 的普通纹理一切正常。
我需要在着色器中为以后的其他动态部分计算这个。

有人能告诉我出了什么问题吗?

这是它目前的样子:

enter image description here

最佳答案

Can someone tell me what is going wrong?



您正在尝试在着色器中计算切线空间基矩阵;那是怎么回事。你实际上不能那样做。
dFdx/y计算给定值的局部变化率,在屏幕空间中,在基元的表面上。换句话说,它计算给定值对基元的导数。您的输入值是线性插值的。

一条线的导数是一个常数。线性插值产生线性结果。因此,每个基元的每个片段都将获得相同的输入/输出导数。因此,每个片段都将计算相同的 S 和 T 值,因为它们完全基于导数。

这就是为什么你会得到一个多面的表面:三个矩阵分量中的两个在三角形的表面上是相同的。

您的计算不起作用,因为它无法工作。您将不得不做其他人所做的事情:离线计算 NBT 矩阵并将它们作为每个顶点的属性传递。或者使用网格的一些已知属性来计算它们。但是这个?这是行不通的。

关于opengl - 在 FragmentShader 中计算切线空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16989475/

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