opengl - 使用 GLSL 着色器 + 光照/法线

标签 opengl glsl shader lighting normals

我已经有了这个不再那么小的基于图 block 的游戏,这是我的第一个真正的 OpenGL 项目。我想将每个图 block 渲染为 3D 对象。因此,首先我创建了一些对象,例如立方体和球体,为它们提供了顶点法线,并使用平面着色以立即模式渲染它们。但由于每个关卡有大约 10,000 个对象,所以速度有点慢。所以我将顶点和法线放入 VBO 中。

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

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

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

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

嗯,我的对象被拉伸(stretch)了 - 但现在 OpenGL 的平面着色被破坏了。我只得到白色色调。而且我找不到任何有用的信息。所以我有几个问题:

  • 我一次只能使用一个着色器吗?当使用我自己的着色器时,OpenGL 平面着色功能会被关闭吗?那么我必须自己实现平面着色吗?

  • 我的向量法线怎么样?我在某处读到,有类似法线矩阵的东西。也许我在修改顶点时也必须对法线应用操作?

最佳答案

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

Well, my objects get stretched - but now OpenGLs flat shading is broken. I just get white shades

我认为你的意思是古拉德着色(平面着色意味着不同的东西)。问题是:如果您使用顶点着色器,则必须执行固定功能管道所做的所有操作。这包括照明计算。 Lighthouse3D 有一个很好的教程 http://www.lighthouse3d.com/tutorials/glsl-tutorial/lighting/正如尼可波拉斯的 http://arcsynthesis.org/gltut/Illumination/Illumination.html 一样

关于opengl - 使用 GLSL 着色器 + 光照/法线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8327543/

相关文章:

C++/W32 Sharing Class - 代码设计题

opengl - GLSL 中的椭圆梯度旋转

java - 模型矩阵畸形结果上的 Opengl 翻译

opengl - 我需要在片段着色器中进行输出 Gamma 校正吗?

c++ - 曲面 segmentation 着色器没有输出?

geometry - 计算点和矩形之间的有符号距离

javascript - 只有第一个调用适用于具有相同顶点缓冲区的多个drawElements调用

c++ - OpenGL 全屏渲染

OpenGL 多 GPU 支持

opengl - Qt 5.5.1 : Cannot find -lGL