gpt4 book ai didi

java - 法线发生了变化,但光照仍然很奇怪?

转载 作者:行者123 更新时间:2023-12-01 04:18:29 28 4
gpt4 key购买 nike

我有一个基本模型查看器,它显示已解析的 OBJ 模型。我在相机所在的位置有一盏灯,因此正在观看的模型的一侧完全照亮。由于某种原因,我的转换没有按照我在渲染器中的预期进行。当我将模型绕 x 轴或 y 轴旋转 90 度时,网格完全变暗。但再旋转 90 度,它又完全亮起来了。

我的转换方法错了吗?或者我的法线一开始就是错误的?


enter image description here
enter image description here
enter image description here
enter image description here


我计算了应用程序中的法线并将其应用了适当的变换(ModelView 矩阵的逆矩阵转置)

Matrix.invertM(mNormalMatrix, 0, mMVMatrix, 0);
Matrix.transposeM(mNormalMatrix, 0, mNormalMatrix, 0);

在将其传递到我的着色器之前:

/*Vertex shader*/
attribute vec3 vPosition;
attribute vec3 vNormal;
uniform mat4 modelViewMatrix;
uniform mat4 mMVPMatrix;
uniform mat4 mViewMatrix;
uniform mat4 normalMatrix;
uniform float lightingEnabled;

varying float lightsEnabled;
varying vec3 lightPosEye;
varying vec3 normalEye;
varying vec3 vertEye;

void main() {

/*Calculate normal matrix*/
vec4 normal = vec4(vNormal, 0.0);
normalEye = normalize(vec3(normalMatrix * normal));

lightsEnabled = lightingEnabled;

lightPosEye = vec3(mViewMatrix * vec4(0.0, 0.0, 3.0, 1.0));

vertEye = vec3(modelViewMatrix * vec4(vPosition, 1.0));

gl_Position = mMVPMatrix * vec4(vPosition, 1.0);
}


/*Fragment shader*/

precision mediump float;
/*uniform vec4 vColor; */

varying float lightsEnabled;
varying vec3 lightPosEye;
varying vec3 normalEye;
varying vec3 vertEye;

void main() {

/*Light output components*/
vec3 Ia;
vec3 Id;

/*light source components*/
vec3 La = vec3(0.5);
vec3 Ld = vec3(1.0);
/*vec3 Ls = vec3(1.0);*/

vec3 Ka = vec3(0.3); /*ambient reflectance term*/
vec3 Kd = vec3(1.0); /*diffuse term*/

/*ambient light term*/
Ia = La * Ka;

float dotProd;
vec3 lightToSurface;

if(lightsEnabled > 0.5){
/*diffuse light term*/
lightToSurface = normalize(lightPosEye - vertEye);

dotProd = dot(lightToSurface, normalEye);
dotProd = max(dotProd, 0.0);
}
else {
dotProd = 1.0;
}

Id = Ld * Kd * dotProd;


gl_FragColor = vec4(Ia + Id, 1.0);
}

最佳答案

我知道已经有一段时间了,但我已经找到了解决方案。问题出在我的顶点着色器中的这一行:

normalEye = normalize(vec3(normalMatrix * normal));

我把它改为:

normalEye = normalize(vec3(modelViewMatrix * normal));

一切正常。虽然我不知道为什么第二行可以工作,而第一行应该工作。

关于java - 法线发生了变化,但光照仍然很奇怪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19216307/

28 4 0
文章推荐: python - 如何在数据框中执行涉及行和列的算术运算?
文章推荐: 用于带有动态列的 ASP.NET 的 jQuery 网格
文章推荐: jQuery 多个从不同