【问题标题】:Using GLSL shaders + lighting / normals使用 GLSL 着色器 + 光照/法线
【发布时间】:2012-01-09 18:47:57
【问题描述】:

我有这个不再那么小的基于图块的游戏,这是我的第一个真正的 OpenGL 项目。我想将每个图块渲染为 3D 对象。所以一开始我创建了一些对象,比如一个立方体和一个球体,为它们提供了顶点法线,并在即时模式下用平面着色渲染它们。但是由于我每个级别有 10.000 个对象,所以速度有点慢。所以我将我的顶点和法线放入 VBO。

这就是我遇到的第一个问题:在使用 VBO 之前,我只为每个对象创建了 push()ed 和 pop()ed 矩阵,并使用 glTranslate / glRotate 将它们放置在我的场景中。但是当我对 VBO 做同样的事情时,灯光开始表现得很奇怪。而不是相机后面的固定照明位置,灯光似乎随着我的物体旋转。绕着它们旋转 180 度时,我只能看到一个影子。

所以我做了一些研究。我找不到任何关于我的具体问题的答案,但我读到,应该实现着色器并为它们提供统一矩阵,而不是使用 glTranslate/glRotate

我想“也许这也可以解决我的问题”,并实施了第一个小型顶点着色器程序,它只是稍微拉伸了我的对象,只是为了在关注细节之前看看我是否可以让着色器工作。

void main(void)
{
    vec4 v = gl_Vertex;
    v.x = v.x * 0.5;
    v.y = v.y * 0.5;
    gl_Position = gl_ModelViewProjectionMatrix * v;
}

好吧,我的对象被拉伸了——但现在 OpenGL 的平面着色被破坏了。我只是得到白色的阴影。而且我找不到任何有用的信息。所以我有几个问题:

  • 我可以一次只使用一个着色器,并且在使用我自己的着色器时,OpenGLs 平面着色被关闭了吗?那么我必须自己实现平面着色吗?

  • 我的矢量法线呢?我在某处读到,有一些类似于正常矩阵的东西。也许我在修改顶点时也必须对我的法线应用操作?

【问题讨论】:

    标签: opengl glsl shader lighting normals


    【解决方案1】:

    您的光照因矩阵运算更改而变得混乱,这意味着您对 glLightfv(..., GL_POSITION, ...) 的调用发生在错误的上下文中(不是 OpenGL 上下文,而是矩阵的状态等)。

    好吧,我的对象被拉伸了——但现在 OpenGL 的平面着色被破坏了。我只是得到白色阴影

    我认为您的意思是 Gourad 阴影(平面阴影意味着不同的东西)。问题是:如果您使用的是顶点着色器,则必须执行固定功能管道所做的一切。这包括照明计算。 Lighthouse3D 有一个很好的教程 http://www.lighthouse3d.com/tutorials/glsl-tutorial/lighting/ 和 Nicol Bolas 的 http://arcsynthesis.org/gltut/Illumination/Illumination.html

    【讨论】:

    • 我重写了 Cocoas NSOpenGLView 并将 glLightfv() 放入 [prepareOpenGL] 方法中。那应该是正确的。此外,它确实在即时模式下工作,自从我切换到 VBO 后它就坏了,所以它确实可以在我放置的地方工作,但不适用于 VBO。
    • @cargath: 不可以。在设置视图后,灯光必须在绘图函数中定位,因为灯光坐标与模型视图矩阵相乘。
    • 嗯,大多数人称之为“平面着色”。它甚至在 OpenGL 本身中被称为“平面着色”:glShadeModel(GL_FLAT);但我明白你的意思,有一种着色方法可以真正展平所有具有相同名称的对象。我猜你所说的固定函数管道是指FFP在顶点转换阶段所做的一切吗?
    • 谢谢。我能找到的所有教程都将它放在 prepareOpenGL 方法中,所以我想我学错了。但是把它放在我的绘图函数中并没有帮助。
    • 经过更多实验后,我认为灯光不再随我的对象旋转。我尝试使用立方体,并且在旋转过程中光照确实发生了变化,只是它变暗然后又变亮又变暗等等......奇怪。
    猜你喜欢
    • 2012-04-04
    • 2011-08-31
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多