我正在通过一些在线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周围搜索了很多,这意味着什么,但是我在任何地方都找不到它的意思。
答案 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来简化原型设计。