English 中文(简体)
开放式GL Diffuse Lighting Shader Bug?
原标题:OpenGL Diffuse Lighting Shader Bug?

《奥兰治书》,第16.2节,列出了实施传播照明的情况:

void main()
{
  vec3 N = normalize(gl_NormalMatrix * gl_Normal);
  vec4 V = gl_ModelViewMatrix * gl_vertex;
  vec3 L = normalize(lightPos - V.xyz);
  gl_FrontColor = gl_Color * vec4(max(0.0, dot(N, L));
}

However, when I run this, the lighting changes when I move my camera. On the other hand, when I change

  vec3 N = normalize(gl_NormalMatrix * gl_Normal);

to vec3 N = normalize(gl_Normal);

我听到了像固定管道这样的电灯。

什么是这种冰川——NormalMatrix,什么是去做的,......这在《range》一书中是一杯子......还是我不适当地制定我的开放Gl法典?

[为了完整起见,碎块只能复制彩色]

问题回答

我希望,在半年多后回答你的问题时,没有任何错误?

因此,在此讨论两点:


a) What should the shader look like

你们的常识用模式矩阵来改变你们的正常状况,而这种模式是特定的。 如果你不这样做,那么,你的模式矩阵可以包含某种轮换。 你们的ube子将轮流使用,但正常情况仍会朝旧方向发展! 这显然是错误的。

因此:当你用模型矩阵改变你的vert时,你也应改变正常情况。 你的正常情况是vec3而不是vec4,你对译文不感兴趣(通常只包含方向),因此,你只能通过<代码>mat3(gl_ModelViewMatrix),即上列3-3子matrix,使您的正常工作倍增。

然后:这是ALMOST正确无误的,但仍然是一个错误——原因如下:。 长篇短篇,而不是mat3(gl_ModelViewMatrix),你得乘以反向的变体。

开放式第2号令对你来说非常有用,其预示着如下:gl_NormalMatrix/。 因此,正确的法典是:

vec3 N = normalize(gl_NormalMatrix * gl_Normal);

b) But it s different from fixed pipeline, why?

我的头一点是,“与你使用固定管道相差错”。

我并不真正热衷于私营部门司(一长活ders!),但就我而言,当你通过<条码>glLightPara amountfv(GL_Lright_POSITION, ......)

我不敢肯定,既然我使用现在使用的是GL3和沙子,那么我会怎样正确回顾一下,那么,我会试图......贵国的模型矩阵状况如何? 我认为,你或许可以具体指明物体空间而不是眼空间的方向,以便你的光能与你的物体一起轮换。 IDK如果在此相关,但确保在使用FF时注意这一点。 我记得,在我仍在使用第1.1 GL时,我经常这样做,这是错误的。

根据示范情况,你可以说明:

  • eye (camera) space,
  • world space,
  • object space.

确保这一点。

Huh. 我希望,这将使你更清楚地了解这个问题。 这些结论是:

  1. always transform your normals along with your vertices in your vertex shaders, and
  2. if it looks different from what you expect, think how you specify your light positions. (Maybe you want to multiply the light postion vector in a shader too? The remarks about light position coordinate systems still hold)




相关问题
Aggravating OpenGL Texture Issue

I m having issues trying to get a texture loaded into VRAM. I m using OpenGL on Mac OS X. I have geometry that I ve successfully renderer by passing a color into my fragment shader. However, as ...

Block filters using fragment shaders

I was following this tutorial using Apple s OpenGL Shader Builder (tool similar to Nvidia s fx composer, but simpler). I could easily apply the filters, but I don t understand if they worked correct (...

Fragment Shader Eye-Space unscaled depth coordinate

I m trying to use the unscaled (true distance from the front clipping plane) distance to objects in my scene in a GLSL fragment shader. The gl_FragCoord.z value is smaller than I expect. In my ...

Fragment shaders on a texture

I am trying to add some post-processing capabilities to a program. The rendering is done using openGL. I just want to allow the program to load some home made fragment shader and use them on the video ...

Fragment-shader blur ... how does this work?

uniform sampler2D sampler0; uniform vec2 tc_offset[9]; void blur() { vec4 sample[9]; for(int i = 0; i < 9; ++i) sample[i] = texture2D(sampler0, gl_TexCoord[0].st + tc_offset[i]); ...