我目前正在用Python编写一个基于glumpy的渲染器。
我使用glumpys的OpenGl特性来渲染一堆点和线。我的点实际上是一个图,所以线是边,多条边可以有一个共享点。
我实现了一个选择器,它使我能够绘制特定的子图。
我为每个顶点在缓冲区中存储了一个alpha值。当我单击时,alpha值被更改,因此只有选定子图的点在alpha = 1的情况下绘制。着色器被调用两次:
# 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值或同样有用的值。
我的顶点着色器:
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;
} ```发布于 2020-04-27 22:54:30
嗯,基本上,有两个选择:
通过使用flat插值限定符,变化的值在整个基元上进行插值
GL_LINES,这通常是每条线的第一个顶点。通常情况下,这两种模式都不能解决您的问题。考虑以下两个连接边AB和BC的情况,分别附加了alpha值1、1和0:
A B C
|------+------|
1 1 0您真正想要的是从不透明到完全透明的急剧过渡,标准解决方案是实际拆分顶点:
A B D C
|-----+++-----|
1 1 0 0现在B和D具有相同的位置,但不同的Alpha值-这就是GPU的顶点模型的真正含义:一组属性-而不仅仅是位置-如果一个属性不同,从技术上讲,它是一个不同的顶点。
对于您的用例,您可能可以完全删除元素缓冲区,并始终每行保留两个不同的顶点。
有一种方法可以检查边的两个节点,并始终选择较低的Alpha值或其他同样有用的值。
不是直接的。有一些非标准的GL扩展,可以让您访问每个顶点的相关数据,如AMD_shader_explicit_vertex_parameter或NV_fragment_shader_barycentric,但这些扩展都不受普遍支持,而且它也远高于您在这里使用的GL版本。
但是,对于您的用例,您可以执行一些简单的片段着色器技巧,如:
gl_FragColor.a = step(0.99999, v_color_alpha);
如果它低于0.99999,它基本上会将alpha设置为0.0,因此它将删除大部分过渡。请注意,带有alpha=0的片段可能仍会写入深度和模板缓冲区,因此您可能需要使用条件discard。
https://stackoverflow.com/questions/61460572
复制相似问题