为什么此着色器在opengl中绘制三角形无法多次运行

时间:2018-08-14 16:50:57

标签: c++ opengl glsl shader

我正在通过一些在线YouTube教程学习使用OpenGL。我正在谈论的代码在24:43:https: //www.youtube.com/watch?v=71BLZwRGUJE&list=PLlrATfBNZ98foTJPJ_Ev03o2oq3-GGOS2&index=7

在该系列的上一个视频中,那个家伙说顶点着色器运行3次(对于三角形),而片段着色器对形状中的每个像素运行一次,但是在我链接的视频中,也没有告诉顶点着色器运行3次,也没有告诉片段着色器运行多次。有人可以解释为什么吗?

我也在努力理解所使用的术语。例如,顶点着色器中的代码为in vec4 position。在片段着色器中有代码out vec4 color。我在Google周围搜索了很多,这意味着什么,但是我在任何地方都找不到它的意思。

1 个答案:

答案 0 :(得分:2)

1。

为需要绘制的图元的每个顶点执行一个顶点着色器。由于在示例中仅绘制了一个三角形(即具有三个顶点的图元),因此顶点着色器显然执行了三次,对该三角形的每个顶点执行一次。顶点着色器的调度由OpenGL本身完成。用户不需要照顾这个。

为光栅化器生成的每个片段执行一个片段着色器(即,光栅化器将基元分解为称为 fragments 的离散元素)。片段对应于像素。尽管这不是双射,但对于某些像素来说,可能没有片段,而对于某些像素,取决于要绘制的场景,可能会有多个片段。片段的调度由OpenGL本身完成。用户不需要照顾这个。

用户仅有效地配置管道的可配置阶段,绑定可编程着色器,绑定着色器输入和输出资源以及绑定几何资源(顶点和索引缓冲区,拓扑)。在示例中,后者对应于包含三角形三个顶点和GL_TRIANGLES拓扑的顶点缓冲区。

给出示例:

// The buffer ID.
unsigned int buffer;
// Generate one buffer object:
glGenBuffers(1, &buffer);
// Bind the newly created buffer to the GL_ARRAY_BUFFER target:
glBindBuffer(GL_ARRAY_BUFFER, buffer);
// Copies the previously defined vertex data into the buffer's memory:
glBufferData(GL_ARRAY_BUFFER, 6 * sizeof(float), positions, GL_STATIC_DRAW);
// Set the vertex attributes pointers
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2, 0);

...

// Bind the buffer as a vertex buffer:
glBindVertexArray(buffer);

...

// Draw a triangle list for the triangles with the vertices at indices [0,3) = 1 triangle:
glDrawArrays(GL_TRIANGLES, 0, 3);

类似的解释清楚的"How to draw a triangle"-tutorial

2。

layout(location = 0) in vec4 position;

类型为vec4(4个float的向量)的vertex shader(即顶点属性)的用户定义输入值,名称为position。在此示例中,每个顶点都有一个position,在最终将 传递到栅格化程序(分配给gl_Position)之前,需要在顶点着色器中对其进行正确的转换。

3。

layout(location = 0) out vec4 color

名称为vec4的类型为float的{​​{3}}(4个color的向量)的用户定义输出值。在此示例中,片段着色器为每个要最终 写入后缓冲区的片段输出恒定的颜色(例如红色)。

参考

一些有用的OpenGL / GLSL参考:

如果您想跳过所有CPU样板,而只关注着色器本身,则可以看看Learn OpenGL来简化原型设计。