gpt4 book ai didi

opengl - 如何在 GLSL 中创建纬度(水平)等高线?

转载 作者:行者123 更新时间:2023-12-05 00:59:19 27 4
gpt4 key购买 nike

我的目标是这种效果:(仅水平轮廓线):

Horizontal Contours

我确实找到了 this example ,但是它会创建水平 垂直轮廓线。我无法完全理解如何调用 fwidth()正在生成线条。

uniform float gsize;//size of the grid
uniform float gwidth;//grid lines'width in pixels
varying vec3 P;

void main()
{
vec3 f = abs(fract (P * gsize)-0.5);
vec3 df = fwidth(P * gsize);
float mi=max(0.0,gwidth-1.0), ma=max(1.0,gwidth);//should be uniforms
vec3 g=clamp((f-df*mi)/(df*(ma-mi)),max(0.0,1.0-gwidth),1.0);//max(0.0,1.0-gwidth) should also be sent as uniform
float c = g.x * g.y * g.z;
gl_FragColor = vec4(c, c, c, 1.0);
gl_FragColor = gl_FragColor * gl_Color;
}

我将如何将该示例修改为仅水平线?

有更好的解决方案吗?

更新:

下面修改着色器的解决方案。仅使用 y 使用浮点数值(value)。
void main() {
float f = fract (_pos.y * 15.0);
float df = fwidth(_pos.y * 15.0);

float g = smoothstep(df * 1.0, df * 2.0, f);

float c = g;

gl_FragColor = vec4(c, c, c, 1.0);
}

最佳答案

fwidth不完全生成线条,主要是 fract是。 fwidth仅用于在屏幕空间中保持线宽不变。

如果您尝试仅使用 fract 绘制 1px 线,它将起作用。但是,如果您想要宽线或抗锯齿线,则需要 fwidth 来进行合理的插值。

如果只有水平线,您可能只需要删除 fract/fwidth 计算中的一个坐标。虽然也许您应该首先从您的链接尝试使用简单版本(更容易理解:D):

varying vec3 k;

void main()
{
vec3 f = fract (k * 100.0);
vec3 df = fwidth(k * 100.0);

vec3 g = smoothstep(df * 1.0, df * 2.0, f);

float c = g.x * g.y * g.z;

gl_FragColor = vec4(c, c, c, 1.0);
}

关于opengl - 如何在 GLSL 中创建纬度(水平)等高线?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30891763/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com