Intel集成显卡参数:
SmoothPointSizeRange(平滑点大小范围):1,255
SmoothPointSizeGranularity(平滑点大小粒度):0.125
【顶点着色器】->【几何着色器】->【片段着色器】
vertex.glsl
传入点的位置(二维平面)、颜色和大小
#version 460 core
layout(location = 0) in vec2 aPosition;
layout(location = 1) in vec3 aColor;
layout(location = 2) in float aSize;
out VS_OUT {
vec3 color;
float size;
} vs_out;
void main(void)
{
gl_Position = vec4(aPosition, 0.0, 1.0);
vs_out.color = aColor;
vs_out.size = aSize;
}geometry.glsl
计算圆的外接矩形框4个顶点
#version 460 core
layout (points) in;
layout (triangle_strip, max_vertices = 4) out;
in VS_OUT {
vec3 color;
float size;
} gs_in[];
out vec3 fColor;
out vec2 fTexCoord;
uniform mat4 mvp;
void main()
{
vec4 center = gl_in[0].gl_Position;
fColor = gs_in[0].color;
float size = gs_in[0].size;
gl_Position = mvp * (center + vec4(-size, size, 0.0, 0.0));
fTexCoord = vec2(0.0, 1.0);
EmitVertex();
gl_Position = mvp * (center + vec4(size, size, 0.0, 0.0));
fTexCoord = vec2(1.0, 1.0);
EmitVertex();
gl_Position = mvp * (center + vec4(-size, -size, 0.0, 0.0));
fTexCoord = vec2(0.0, 0.0);
EmitVertex();
gl_Position = mvp * (center + vec4(size, -size, 0.0, 0.0));
fTexCoord = vec2(1.0, 0.0);
EmitVertex();
EndPrimitive();
}fragment.glsl
与圆心距离大于0.5的点不渲染,并对边缘点平滑,避免毛刺
#version 460 core
in vec3 fColor;
in vec2 fTexCoord;
out vec4 outputColor;
const float smoothness = 0.02;
void main()
{
vec2 center = vec2(0.5, 0.5);
float distance = distance(fTexCoord, center);
if (distance > 0.5) discard;
float alpha = 1.0 - smoothstep(0.5 - smoothness, 0.5, distance);
outputColor = vec4(fColor, alpha);
}获取OpenGL参数
获取平滑点大小范围和平滑点大小粒度
// OpenGL版本
string glVersion = GL.GetString(StringName.Version);
// GLSL版本
string glslVersion = GL.GetString(StringName.ShadingLanguageVersion);
// 渲染器
string renderer = GL.GetString(StringName.Renderer);
// 供应商
string vendor = GL.GetString(StringName.Vendor);
// 获取点大小的最小和最大范围(平滑)
float[] pointSizeRangeSmooth = new float[2];
GL.GetFloat(GetPName.SmoothPointSizeRange, pointSizeRangeSmooth);
float minPointSizeSmooth = pointSizeRangeSmooth[0];
float maxPointSizeSmooth = pointSizeRangeSmooth[1];
// 获取点大小颗粒度/增量 (Granularity)
// 这表示在平滑模式下,点大小可以增加的最小步进值
float pointSizeGranularity = GL.GetFloat(GetPName.SmoothPointSizeGranularity);原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。