相关疑难解决方法(0)

使用片段着色器在2d多边形上绘制边框

我有一些简单的多边形(少于20个顶点)在一个简单的xy平面上渲染平面,使用GL_TRIANGLES和一个平面颜色,一个2d模拟.

我想为这些多边形添加可变厚度和不同颜色的边框.我有一些使用相同顶点和glLineWidth/GL_LINE_LOOP实现的东西,它起作用,但是是另一个渲染过程并重复所有顶点变换.

我想我应该能够使用gl_FragCoord和顶点数据和/或纹理坐标在片段着色器中完成此操作,但我不确定,我的天真尝试显然是不正确的.

我想象下面的东西.

uniform vec2 scale;  // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;

varying vec4 vertex; // in world coords

void main()
{
    if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
    {
        // we're close to the edge the polygon, so we're the border.
        gl_FragColor = border_color;
    }
    else
    {
        gl_FragColor = fill_color;
    }
}
Run Code Online (Sandbox Code Playgroud)

我想弄清楚的部分是distance_from_edge函数 - 如何计算?使用gl_FragCoord是错误的方法 - 我应该使用某种纹理映射吗?

作为一个实验,我尝试用缩放将顶点转换为像素空间,然后以像素为单位计算它与gl_FragCoord之间的距离,但这会产生我并不真正理解的奇怪结果.另外我需要到边缘的距离,而不是顶点,但我不知道如何得到它.

有任何想法吗?

编辑:根据尼科尔的回应,我的问题变成:

假设我有一个三角形,其中3个角顶点标记为边缘顶点,并且中间的一个顶点标记为非边缘(因此总共渲染了3个三角形),那么如何在片段着色器中插值以绘制给定边框厚度?我假设我将边缘标志传递给片段着色器,以及所需的线条粗细,并进行一些插值计算以计算边缘与非边缘顶点之间的距离,并将颜色阈值设置为适当的边界/填充?

opengl-es glsl vertex-shader fragment-shader opengl-es-2.0

21
推荐指数
1
解决办法
2万
查看次数

OpenGL:调试“单程线框渲染”

我正在尝试实现论文“Single-Pass Wireframe Rendering”,这看起来很简单,但它给了我我所期望的厚、暗值。

这篇论文没有给出计算海拔的确切代码,所以我按照我认为合适的方式做了。代码应该将三个顶点投影到视口空间,获取它们的“高度”并将它们发送到片段着色器。

片段着色器确定最近边缘的距离并生成一个边缘强度。我不确定我应该用这个值做什么,但由于它应该在 [0,1] 之间缩放,我将逆与我的输出颜色相乘,但它非常弱。

我有几个问题,我不确定是否在论文中得到解决。首先,是否应该在 2D 而不是 3D 中计算高度?其次,他们站点 DirectX 功能,其中 DirectX 具有不同的视口空间 z 范围,对吗?那有关系吗?我将输出高度距离与视口空间坐标的 w 值相乘,因为他们建议校正透视投影。

试图校正透视投影的图像

无校正(不预乘 w 值)

未校正的图像似乎有明显的问题,无法校正更远侧的透视,但透视校正的图像具有非常弱的值。

谁能看到我的代码有什么问题或如何从这里调试它?

我在 GLSL 中的顶点代码...

float altitude(in vec3 a, in vec3 b, in vec3 c) { // for an ABC triangle
  vec3 ba = a - b;
  vec3 bc = c - b;
  vec3 ba_onto_bc = dot(ba,bc) * bc;
  return(length(ba - ba_onto_bc));
}

in vec3 vertex; // incoming vertex
in vec3 v2; // first neighbor (CCW) …
Run Code Online (Sandbox Code Playgroud)

opengl wireframe render glsl

4
推荐指数
1
解决办法
2629
查看次数