【问题标题】:GLSL - A do-nothing vertex shader?GLSL - 无所事事的顶点着色器?
【发布时间】:2014-05-18 04:20:27
【问题描述】:

所以我有一个在对象上绘制一组的 opengl 程序。当我绘制这些对象时,我想使用我的着色器程序是一个顶点着色器和一个专门的顶点着色器。基本上,我的目标是根据纹理计算调整顶点着色器内模型的高度。就是这样。否则,我希望像使用裸 openGL(无着色器)一样绘制对象。我不想实现片段着色器。

但是我还没有找到如何制作它,所以我可以拥有一个只有顶点着色器而没有其他任何东西的着色器程序。忘记了关于调整模型高度的部分,到目前为止我有:

gl_FrontColor = gl_Color;
gl_Position = modelViewProjectionMain * Position;

它可以将对象转换到正确的位置,但是当我这样做时,我会丢失纹理坐标和光照信息(法线丢失)。我错过了什么?如何编写“无所事事”的顶点着色器?也就是说,一个顶点着色器你可以在用法线绘制带纹理的 .obj 时关闭和打开,不会有区别吗?

【问题讨论】:

  • 你的 "do nothing" 顶点着色器实际上是gl_Position = ftransform ();。当然,这已被弃用,但你的问题让我相信这并不重要。

标签: opengl glsl vertex-shader


【解决方案1】:

您不能编写带有部分实现的着色器。要么您在着色器中执行所有操作,要么完全依赖给定对象的固定功能(已弃用)。

你可以这样做:

glUseProgram(handle)
 // draw objects with shader
glUseProgram(0)
// draw objects with fixed functionality

【讨论】:

    【解决方案2】:

    为了扩展 Abhishek Bansal 的完全正确答案,您想做的事情会很好,但实际上是不可能的。您将不得不编写自己的顶点和片段着色器。

    在您的帖子中,“裸 OpenGL”是指 OpenGL 1 和 2 中的固定功能管道,其中包括内置照明和纹理。 OpenGL 中的着色器完全取代了固定功能管道,而不是对其进行扩展。在 OpenGL 3+ 中,旧功能已被删除,因此现在它们是强制性的。

    好消息是,执行与原始 OpenGL 光照和纹理相同功能的顶点/片段着色器很容易找到并且很容易根据您的目的进行修改。 Rost、Licea-Kane 等人的 OpenGL 着色语言书有一整章“模拟 OpenGL 固定功能”或者您可以获得第 5 版 OpenGL SuperBible 书籍和代码(不是第 6 版)的副本,其中包含一堆有用的预定义着色器。或者,如果您更喜欢在线资源而不是书籍,可以使用 NeHe 教程。

    一开始编写着色器似乎有点令人生畏,但它比您想象的要容易,而且额外的灵活性非常值得。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-31
      • 1970-01-01
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 2022-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多