首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有办法阻止GL_EDGES上的色彩插图?

有没有办法阻止GL_EDGES上的色彩插图?
EN

Stack Overflow用户
提问于 2020-04-27 21:57:07
回答 1查看 63关注 0票数 1

我目前正在用Python编写一个基于glumpy的渲染器。

我使用glumpys的OpenGl特性来渲染一堆点和线。我的点实际上是一个图,所以线是边,多条边可以有一个共享点。

我实现了一个选择器,它使我能够绘制特定的子图。

我为每个顶点在缓冲区中存储了一个alpha值。当我单击时,alpha值被更改,因此只有选定子图的点在alpha = 1的情况下绘制。着色器被调用两次:

代码语言:javascript
复制
# Draw Points
self.program_points.draw(gl.GL_POINTS)

# Draw Lines
self.program_points.draw(gl.GL_LINES, self.edge_buffer)

我的问题是:alpha值设置正确,两个点alpha =1的边也被正确渲染,但是一个点alpha =1和一个alpha =0点的边淡出。

我不想给褪色的边缘上色。有没有一种方法可以检查边的两个节点,并始终选择较低的alpha值或同样有用的值。

我的顶点着色器:

代码语言:javascript
复制
uniform vec2 resolution;

attribute vec3 position;
attribute float radius;

attribute float  color;
attribute float color_alpha;
attribute float id;

// for AA
varying vec4 v_position;
varying float v_radius;
varying float v_color_alpha;


varying vec4  v_id;
varying float  v_color;

void main (void)
{
    // this is for the picker!
    v_id = vec4 (mod(floor(id / (256*256)), 256) / 255.0,
             mod(floor(id /     (256)), 256) / 255.0,
             mod(floor(id /       (1)), 256) / 255.0,
             1.0 );
    // values to the fragment shader
    v_color         = color;
    v_color_alpha   = color_alpha;
    v_radius        = radius;

    //two pixel for AA
    gl_PointSize = 2.0+ ceil(2.0*radius);

    // hook for the Cameramovement
    v_position = <transform(position)>;
    gl_Position = v_position;
} ```
EN

回答 1

Stack Overflow用户

发布于 2020-04-27 22:54:30

嗯,基本上,有两个选择:

通过使用flat插值限定符,变化的值在整个基元上进行插值

  • 变化的值对于基元是恒定的。如果基元不只是一个点,这意味着数据只能来自其中一个顶点,这称为提供顶点。对于GL_LINES,这通常是每条线的第一个顶点。

通常情况下,这两种模式都不能解决您的问题。考虑以下两个连接边ABBC的情况,分别附加了alpha值110

代码语言:javascript
复制
A      B      C 
|------+------|
1      1      0

您真正想要的是从不透明到完全透明的急剧过渡,标准解决方案是实际拆分顶点:

代码语言:javascript
复制
A     B D     C 
|-----+++-----|
1     1 0     0

现在BD具有相同的位置,但不同的Alpha值-这就是GPU的顶点模型的真正含义:一组属性-而不仅仅是位置-如果一个属性不同,从技术上讲,它是一个不同的顶点。

对于您的用例,您可能可以完全删除元素缓冲区,并始终每行保留两个不同的顶点。

有一种方法可以检查边的两个节点,并始终选择较低的Alpha值或其他同样有用的值。

不是直接的。有一些非标准的GL扩展,可以让您访问每个顶点的相关数据,如AMD_shader_explicit_vertex_parameterNV_fragment_shader_barycentric,但这些扩展都不受普遍支持,而且它也远高于您在这里使用的GL版本。

但是,对于您的用例,您可以执行一些简单的片段着色器技巧,如:

gl_FragColor.a = step(0.99999, v_color_alpha);

如果它低于0.99999,它基本上会将alpha设置为0.0,因此它将删除大部分过渡。请注意,带有alpha=0的片段可能仍会写入深度和模板缓冲区,因此您可能需要使用条件discard

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61460572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档