首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >OpenTK:使用几何着色器破解点的大小限制

OpenTK:使用几何着色器破解点的大小限制

原创
作者头像
秦建辉
修改2025-09-08 10:46:04
修改2025-09-08 10:46:04
2030
举报
文章被收录于专栏:OpenTKOpenTK

Intel集成显卡参数:

SmoothPointSizeRange(平滑点大小范围):1,255

SmoothPointSizeGranularity(平滑点大小粒度):0.125

【顶点着色器】->【几何着色器】->【片段着色器】

vertex.glsl

传入点的位置(二维平面)、颜色和大小

代码语言:c
复制
#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个顶点

代码语言:c
复制
#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的点不渲染,并对边缘点平滑,避免毛刺

代码语言:c
复制
#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参数

获取平滑点大小范围和平滑点大小粒度

代码语言:csharp
复制
// 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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档