我有这个不再那么小的基于图块的游戏,这是我的第一个真正的 OpenGL 项目。我想将每个图块渲染为 3D 对象。所以一开始我创建了一些对象,比如一个立方体和一个球体,为它们提供了顶点法线,并在即时模式下用平面着色渲染它们。但是由于我每个级别有 10.000 个对象,所以速度有点慢。所以我将顶点和法线放入 VBO。
那就是我遇到第一个问题的地方:在使用 VBO 之前,我只是为每个对象push()
编辑和编辑矩阵,并使用/将它们放置在我的场景中。但是当我对 VBO 做同样的事情时,灯光开始表现得很奇怪。而不是相机后面的固定照明位置,灯光似乎随着我的物体旋转。当绕着它们转 180 度时,我只能看到一个影子。pop()
glTranslate
glRotate
所以我做了一些研究。我找不到针对我的具体问题的任何答案,但我读到,应该实现着色器并为它们提供统一矩阵,而不是使用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 的平面着色被破坏了。我只是得到白色的阴影。而且我找不到任何有用的信息。所以我有几个问题:
我一次只能使用一个着色器,而当使用我自己的着色器时,OpenGL 的平面着色被关闭了吗?那么我必须自己实现平面阴影吗?
我的向量法线呢?我在某处读到,有一些类似于正常矩阵的东西。也许我在修改顶点时也必须对我的法线应用操作?