2014-07-06 54 views
1

什么时候应该使用以下每种方法在glsl中接收数据?GLSL属性类型/版本迷茫

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

据我所知,“in”意味着它是一个属性,而不是一个统一体。制服在所有着色器中都可用,而为此特定着色器定义一个属性。此外,制服通过glUniformTYPE传递,而属性(我不知道这一点)必须通过缓冲区传递。

我试图避免在像glMatrix等功能的内置opengl的内置,因为教程建议这基本上是depricated /旧风格。那是对的吗?如果是这样,我如何将索引分配给缓冲区?

回答

3

您粘贴的三行指定完全不同的东西。

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向该属性提供数据。

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

#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); 
} 

所以,“在”的含义和“out “取决于他们得到使用的特定着色器阶段。


uniform float x; 

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


如果是的话,我将如何分配到指标,例如一个缓冲区?

这是什么意思?


有现代OpenGL绘图的教程,这使得这些事情讲清楚,坚持现代化的标准,同时还涵盖了所有的基本知识?

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

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

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