我看过的所有关于在OpenGL中绘制圆形的教程都使用了“扇形”方法(或其变体),但我没有看到有人使用以下方法:
创建如下所示的一组顶点:
float vertices[] = {
0.5f, 0.5f, 0.0f, 1.0f, 1.0f, // top right
0.5f, -0.5f, 0.0f, 1.0f, -1.0f, // bottom right
-0.5f, -0.5f, 0.0f, -1.0f, -1.0f,// bottom left
-0.5f, 0.5f, 0.0f, -1.0f, 1.0f// top left
};
创建以下顶点着色器,以可变格式将边界信息传递给片段着色器:
#version 330 core
in vec3 apos;
in vec2 abound;
out vec3 ourColor;
out vec2 ourBound;
void main() {
gl_Position = vec4(apos, 1.0);
ourBound = abound;
}
创建以下片段着色器,它使用插值的边界值来计算当前片段距离中心点的距离。
#version 330 core
in vec2 ourBound;
uniform vec4 setColor;
void main() {
float dist = sqrt((ourBound.x * ourBound.x) + (ourBound.y * ourBound.y));
vec4 color_used = vec4(vec3(1.0), 0.0);
if(dist < 1.0){
color_used = setColor;
}
gl_FragColor = color_used;
}
- 加载着色器
- 启用混合
- 为apos(偏移量=0,步幅=5 * sizeof(float))和abound(偏移量=3,步幅=5 * sizeof(float))初始化VBO / EBO对象
- 初始化colorLocation
- 存储在VBA中
在绘制循环中加载程序:
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(shader_program);
glUniform4f(colorLocation, 0.0f, 1.0f, 0.0f, 1.0f);
glBindVertexArray(VAO);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
我不明白为什么要创建一个风扇,这样做有什么性能优势吗?看起来肯定不是更简单了。除了这里提供的方法,我在谷歌上找不到其他替代方案。
incircle()
检查,会发生什么? - genpfaultincircle()
技巧。三角形扇形方法适用于固定函数和可编程管线。 - genpfault