【问题标题】:Confused by GLSL attribute types / versions对 GLSL 属性类型/版本感到困惑
【发布时间】:2014-07-07 21:43:10
【问题描述】:

我应该什么时候使用以下每种方法在 glsl 中接收数据?

layout(points) in;
in vec3 pos;
uniform float x;

据我了解,“in”意味着它是一个属性,而不是制服。 Uniforms 在所有着色器中都可用,而 in 定义了这个特定着色器的属性。制服也通过 glUniformTYPE 传递,而属性(我不确定)必须通过缓冲区传递。

我试图避免 opengl 的内置函数,如 glMatrix 等,因为教程建议这基本上是贬低/旧式。那是对的吗?如果是这样,例如,我将如何将索引分配给缓冲区?

【问题讨论】:

    标签: opengl glsl opentk


    【解决方案1】:

    您粘贴的三行指定了完全不同的内容。

    layout(points) in;
    

    这看起来像是 几何着色器阶段的输入限定。它声明此几何着色器将GL_POINTS 作为输入基元类型(即您必须绘制GL_POINTS)。例如,它通常后面跟着类似的声明,然后从几何着色器中输出这些图元。

    layout(triangle_strip, max_vertices=3) out; // drawing triangles
    

    in vec3 pos;
    

    这反而为这个着色器阶段声明了一个通用的“输入”,类型为 vec3。根据实际的着色器阶段,其含义可能会有所不同。例如,在顶点着色器中,这意味着这是一个每个顶点的属性 - 即一堆数据,每个顶点都是唯一的¹。在几何着色器中,您将获得 整个基元 作为输入。在片段着色器中栅格化值。

    在顶点着色器的情况下,每个被处理的顶点都会从一个合适的配置输入数组中获得自己的“pos”,通常²来自之前绑定到 GL_ARRAY_BUFFER 绑定的缓冲区对象点并已配置为通过glVertexAttribPointer 调用向该属性提供数据。

    OR,它可以是片段着色器的输入。在这种情况下,它是每个片段的属性,它(在没有额外条件的默认情况下)已经过透视校正插值。例如,顶点着色器可以为每个顶点输出一种颜色:

    #version 330
    in vec3 position;
    in vec3 input_color; // attribute as before
    
    out vec3 color; // output towards the next shader stage
    
    // (potentially) ran once per input vertex
    void main() {
        gl_Position = vec4(position, 1.0);
        color = input_color;
    }
    

    片段着色器可以选择插值颜色:

    #version 330
    
    in vec3 color; // automatically "paired" to the VS output, i.e. the previous shader stage 
                   // gets perspective-correct interpolation
    
    
    out vec4 screenColor; // output => drawn on the screen
    
    // (potentially) ran once per drawn fragment
    void main() {
        screenColor = vec4(color, 1.0);
    }
    

    因此,“in”和“out”的含义取决于它们所使用的特定着色器阶段。


    uniform float x;
    

    这只是意味着“x”是整个着色器程序的浮点类型的统一。它不能从着色器程序中更改;所有着色器阶段都会看到它(他们只需要声明它)。


    如果是这样,例如,我将如何将索引分配给缓冲区?

    这是什么意思?


    是否有关于现代 opengl 绘图的教程,它使这些事情变得清晰并坚持现代标准,同时还涵盖了所有基础知识?

    是的,例如http://www.opengl-tutorial.org/

    ¹这条规则有一些例外,例如属性除数,但让我们保持简单。

    ² 阅读:你应该做什么。您可以避免使用缓冲区并直接指定顶点属性值,但很可能发生的情况是 GL 驱动程序会在后台分配缓冲区。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-08
      相关资源
      最近更新 更多