gpt4 book ai didi

opengl - 延迟渲染和移动点光源

转载 作者:行者123 更新时间:2023-12-02 02:17:29 24 4
gpt4 key购买 nike

我知道网上有几个关于同一问题的线程,但我没有从这些线程中得​​到帮助,因为我的实现不同。

我正在将 View 空间中的颜色、法线和深度渲染为纹理。第二步,我将纹理与全屏四边形绑定(bind)并计算照明。定向光似乎工作正常,但点光源随相机移动。

我分享相应的着色器代码:

光照步骤顶点着色器

in vec2 inVertex;
in vec2 inTexCoord;
out vec2 texCoord;
void main() {
gl_Position = vec4(inVertex, 0, 1.0);
texCoord = inTexCoord;
}

光照步骤片段着色器

float depth = texture2D(depthBuffer, texCoord).r;
vec3 normal = texture2D(normalBuffer, texCoord).rgb;
vec3 color = texture2D(colorBuffer, texCoord).rgb;

vec3 position;
position.z = -nearPlane / (farPlane - (depth * (farPlane - nearPlane))) * farPlane;
position.x = ((gl_FragCoord.x / width) * 2.0) - 1.0;
position.y = (((gl_FragCoord.y / height) * 2.0) - 1.0) * (height / width);
position.x *= -position.z;
position.y *= -position.z;

normal = normalize(normal);
vec3 lightVector = lightPosition.xyz - position;
float dist = length(lightVector);
lightVector = normalize(lightVector);

float nDotL = max(dot(normal, lightVector), 0.0);
vec3 halfVector = normalize(lightVector - position);
float nDotHV = max(dot(normal, halfVector), 0.0);

vec3 lightColor = lightAmbient;
vec3 diffuse = lightDiffuse * nDotL;
vec3 specular = lightSpecular * pow(nDotHV, 1.0) * nDotL;
lightColor += diffuse + specular;
float attenuation = clamp(1.0 / (lightAttenuation.x + lightAttenuation.y * dist + lightAttenuation.z * dist * dist), 0.0, 1.0);

gl_FragColor = vec4(vec3(color * lightColor * attenuation), 1.0);

我将灯光属性作为制服发送到着色器:

shader->set("lightPosition", (viewMatrix * modelMatrix).inverse().transpose() * vec4(0, 10, 0, 1.0));

viewmatrix 是相机矩阵,modelmatrix 只是这里的恒等式。

为什么点光源随相机移动而不是随模型移动?

欢迎任何建议!

最佳答案

除了没有人评论说你计算的所有向量都必须标准化之外,你还必须确保它们都在同一个空间中。如果您使用 View 空间位置作为 View 向量,则法线向量也必须位于 View 空间中(在第一遍写入 G 缓冲区之前必须通过转置模型 View 矩阵进行转换)。并且光矢量也必须位于 View 空间中。因此,您必须通过 View 矩阵(或模型 View 矩阵,如果灯光位置不在世界空间中)来变换灯光位置,而不是其逆转置。

shader->set("lightPosition", viewMatrix * modelMatrix * vec4(0, 10, 0, 1.0));

编辑:对于定向光,如果您将光方向指定为光的方向(例如 vec4(0, 1, 0, 0 ) 表示指向 -z 方向的光)。

关于opengl - 延迟渲染和移动点光源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7222016/

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