【问题标题】:1. Do i have to use a draw function for every shader? 2. Do I need a different shader for every different texture I want to draw?1. 我必须为每个着色器使用绘图功能吗? 2. 对于我想要绘制的每个不同的纹理,我是否需要不同的着色器?
【发布时间】:2020-05-10 10:08:53
【问题描述】:

尝试学习openGL。我想在单个 VAO 中使用相同的着色器绘制多个模型,但每个模型都有不同的纹理,这可能吗?

如果不是这样,它就不是很实用,因为我必须为我想使用的每个纹理编译一个不同的着色器,并且它会有相同的代码让我的胃转动,或者改变纹理并调用每次绘制功能都让我更加恶心xd。

我也一直在网上找,我找不到任何人在一个绘制函数中绘制多个着色器,他们使用(useProgram(program)),然后绘制VAO,所以你需要一个不同的每个着色器的 VAO?

我认为 VAO 仅适用于顶点格式。我希望你明白我的意思,我很擅长表达自己。

【问题讨论】:

    标签: c++ opengl


    【解决方案1】:

    着色器就像 VAO、VBO 等。您有一个着色器 ID,绑定该着色器,然后进行绘图调用。然后,您可以绑定另一个着色器,进行另一个绘制调用,等等。都在同一个绘图函数中。

    当然,纹理或多或少是相同的。每个纹理也有一个 ID,因此您可以绑定和取消绑定它们以选择要使用的纹理单元。

    原则上,您需要绑定数据(VAO)、纹理和着色器。您可以任意组合使用它们。

    【讨论】:

    • 可见的混乱 你说我需要做 1 个绘图调用/着色器,然后你说它们都在同一个绘图函数中。所以我知道我需要为每个具有不同纹理的模型制作不同的 VAO?如果不是,我会为每个绘制调用绘制整个场景,不是吗?我不能将着色器绑定到 VBO 吗?
    • draw call是一个OpenGL调用,比如glDrawElements。为此,您需要分别绑定 VAO、着色器和纹理。但是你可以从同一个绘图函数中进行多个这样的绘图调用。
    【解决方案2】:

    VAO 保存有关如何将存储在缓冲区中的数据传递给着色器的信息(它保存它的“内存布局”)。您可以将多个对象存储在一个 VAO 中,也可以为每个对象创建一个 VAO。

    Shader 和 VAO 之间没有直接耦合。

    glUseProgram 表示应使用哪个着色器程序进行绘图,glBindVertexArray 表示应将数据传递给着色器程序的 VAO,设置好组合后,您将发出绘图命令。

    您可以使用不同的着色器在 VAO 上绘制,或者使用一个着色器来绘制不同的 VAO,或者使用相同或不同的着色器多次绘制一个 VAO。

    但是对于每个 VAO Shader 组合,你需要发出 on draw 命令。

    在每次绘制之前,您可以更改着色器应使用的制服和/或纹理。

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多