gpt4 book ai didi

c++ - GLSL 灯光/高光随相机移动

转载 作者:行者123 更新时间:2023-11-30 03:04:45 25 4
gpt4 key购买 nike

VC++ 2010、OpenGL、GLSL、SDL

我正在转向着色器,遇到了最初在使用 ogl 管道时出现的问题。也就是说,光的位置似乎指向我的相机面向的任何方向。在 ogl 管道中,它只是镜面高光,可以通过以下方式修复:

glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER, 1.0f);

这是两个着色器:

顶点

varying vec3 lightDir,normal;

void main()
{
normal = normalize(gl_NormalMatrix * gl_Normal);
lightDir = normalize(vec3(gl_LightSource[0].position));

gl_TexCoord[0] = gl_MultiTexCoord0;
gl_Position = ftransform();
}

片段

varying vec3 lightDir,normal;
uniform sampler2D tex;

void main()
{
vec3 ct,cf;
vec4 texel;
float intensity,at,af;

intensity = max(dot(lightDir,normalize(normal)),0.0);

cf = intensity * (gl_FrontMaterial.diffuse).rgb +
gl_FrontMaterial.ambient.rgb;
af = gl_FrontMaterial.diffuse.a;

texel = texture2D(tex,gl_TexCoord[0].st);
ct = texel.rgb;
at = texel.a;

gl_FragColor = vec4(ct * cf, at * af);
}

如有任何帮助,我们将不胜感激!

最佳答案

问题是:您希望灯光位于什么坐标系(引用系)?可能是“世界”。

但是,OpenGL 的固定功能管道没有世界坐标的概念,因为它使用一个模型 View 矩阵,该矩阵直接从眼睛(相机)坐标转换为模型坐标。为了拥有“固定”灯,您可以执行以下操作之一:

  • 经典的 OpenGL 方法是,在每一帧中,将模型 View 矩阵设置为仅作为 View 变换(即,作为您要在其中指定灯光位置的坐标系) 然后使用 glLight 设置位置(指定将模型 View 矩阵应用于输入)。

  • 由于您使用的是着色器,因此您还可以拥有单独的模型和 View 矩阵,并让您的着色器将两者(而不是使用 ftransform)应用于顶点,但仅将 View 矩阵应用于灯光。但是,这意味着更多的逐顶点矩阵运算,除非您追求的是清晰度而不是性能,否则这可能不是一个特别好的主意。

关于c++ - GLSL 灯光/高光随相机移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8375950/

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