在OpenGL场景中创建聚光灯

时间:2013-10-31 15:47:16

标签: c++ opengl lighting vertex-shader

我正在研究OpenGL并尝试在我的应用程序中创建一个聚光灯。我用于#vertex-shader的代码如下所示:

    #:vertex-shader #{
        #version 150 core
            in vec3 in_pos;
            in vec2 in_tc;
            out vec2 tc;

            glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 20.0f);
            GLfloat spot_direction[] = { -1.0, -1.0, 0.0 };
            glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, spot_direction);

            glEnable(GL_LIGHT0);


            void main() {

                vec4 pos= vec4(vec3(1.0)*in_pos - vec3(1.0), 1.0);
                pos.z=0.0;
                gl_Position =   pos;
                tc = in_tc;
            }
}

问题是,每次我尝试运行代码时都会出现错误:

Type: other, Source: api, ID: 131169, Severity: low
Message: Framebuffer detailed info: The driver allocated storage for renderbuffer 1.
 len = 157, written = 0
failed to compile vertex shader of deferred: directional
info log for shader deferred: directional
vertex info log for shader deferred: directional:
ERROR: Unbound variable: when

规格:

Renderer: GeForce GTX 580/PCIe/SSE2
Version: 3.3.0 NVIDIA 319.17
GLSL: 3.30 NVIDIA via Cg compiler
Status: Using GLEW 1.9.0
1024 x 768
OS: Linux debian

我想创建这个聚光灯非常简单,但因为我对OpenGL很新,所以到目前为止我还没有办法知道如何做到这一点,甚至阅读以下来源:

http://www.glprogramming.com/red/chapter05.html#name3

在某些地方也可以阅读光点很难理解,但我现在无法避免这一步骤,因为我正在按照我的讲座时间表。有人能帮助我吗?

1 个答案:

答案 0 :(得分:2)

你完全误解了着色器的作用。首先,你要在全局范围内声明函数调用,但无论如何都是不允许的。然后,由于某种原因,我无法理解你试图在着色器中调用已弃用的旧样式,固定函数OpenGL状态setter函数。这不是它的工作原理。

我建议您前往一个不错的OpenGL教程,并从头开始 ,而不必跳过任何事情。我建议http://arcsynthesis.org/gltut