【问题标题】:Creating spotlight in OpenGL scene在 OpenGL 场景中创建聚光灯
【发布时间】:2013-10-31 15:47:16
【问题描述】:

我正在学习 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

在一些亮点可能很难理解的地方也阅读,但我现在无法避免这一步,因为我正在按照我的课程安排。有人能帮帮我吗?

【问题讨论】:

  • 着色器中的 GL 函数?这太可怕了。你为什么这么做?您是否以某种方式预处理该来源?此外,您正在使用 GLSL 150 着色器并且仍然使用传统 GL?为什么?
  • 你在问我一堆我不知道争论的问题,而不是提出这么多问题,你可以让我明白发生了什么......
  • 查看 datenwolf 的回答。那是正确的。
  • 有时我只是讨厌有些人在这里处理菜鸟问题的方式,他们真的很粗鲁,总有一天他们是初学者,所以在投票否决并关闭之前不要三思而后行。这应该保持开放,向新手展示如何处理阅读教程的艰难路径。恕我直言,我只有 2 周的课,我要处理我的教授日程,还要争分夺秒地学习我在课堂上学不到的概念。希望人们知道这意味着什么。
  • 如果你指的是我,我的本意并不是粗鲁——有时你看到的某些事情只是伤害了你。 :) 实际上,就像 datenwolf 一样,我无法理解您是如何想到将常规 GL 函数放入着色器的。如果你在什么地方看过这个,即使是你教授的幻灯片,请告诉我在哪里,这样我就可以代替你对他们大喊大叫了。相信我,我知道这意味着什么,可能这里的很多人都知道——你不是唯一一个有学术经验的人。

标签: c++ opengl lighting vertex-shader


【解决方案1】:

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

我建议您学习一个不错的 OpenGL 教程,并从头开始完成它,不要跳过任何内容。我建议http://arcsynthesis.org/gltut

【讨论】:

  • 感谢您的回答,5 分钟后将接受并立即开始做脏活。谢谢
  • 再次过来感谢您提供给我的链接。这本书真的很棒,它抓住了我已经知道的基本概念,但它总是很好的刷新。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-24
相关资源
最近更新 更多