程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了为什么这个着色器圆比传递的半径小这么多?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决为什么这个着色器圆比传递的半径小这么多??

开发过程中遇到为什么这个着色器圆比传递的半径小这么多?的问题如何解决?下面主要结合日常开发的经验,给出你关于为什么这个着色器圆比传递的半径小这么多?的解决方法建议,希望对你解决为什么这个着色器圆比传递的半径小这么多?有所启发或帮助;

我正在开发一个 GLSL 着色器,它根据给定的中心位置和半径绘制一个圆。出于某种原因,我不明白,圆的半径与我经过的半径不匹配。也就是说,当我为 100 传入 u_radius 时,半径改为 56。我尝试将着色器中的值加倍,然与此接近,但仍然略有不准确。有没有人知道导致这种差异的原因是什么?

precision mediump float;

varying vec4 v_pos;

uniform mat3 u_matrix;
uniform vec2 u_center; // the center of the circle in world coordinates

uniform float u_aspect; // aspect ratio. 1.7778 for my monitor (1920x1080)
uniform float u_radius; // radius. passing in 100

uniform vec2 u_canvasSize; // [ 1920,1080 ]

voID main() {
  vec4 c = vec4((u_matrix * vec3(u_center,1)).xy,1); // center

  vec2 onePix = vec2(1.0,1.0) / u_canvasSize; // the size of one pixel in clip-space

  float onePixLength = sqrt(onePix.x * onePix.x + onePix.y * onePix.y); // magnitude of one pixel

  float r = onePixLength * u_radius; // radius converted to clip-space

  vec2 dist = (v_pos.xy - c.xy) * vec2(u_aspect,1.0); // distance from center to current shader point

  if (dist.x * dist.x + dist.y * dist.y > r * r) {
    discard;
  }

  gl_Fragcolor = vec4(1.0,1.0,1.0);
}

解决方法

是因为标准化的设备空间坐标在 [-1.0,1.0] 范围内。因此在计算像素大小时缺少 2 因子:

vec2 onePix = vec2(1.0,1.0) / u_canvasSize;

vec2 onePix = vec2(2.0) / u_canvasSize;

另外,您需要计算像素的边长而不是对角线长度。宽度(x 维度)按纵横比缩放。因此,您需要计算一个像素的高度:

float onePixLength = sqrt(onePix.x * onePix.x + onePix.y * onePix.y);

float onePixLength = onePix.y;

注意,onePix.x * u_aspect 等于 onePix.y

大佬总结

以上是大佬教程为你收集整理的为什么这个着色器圆比传递的半径小这么多?全部内容,希望文章能够帮你解决为什么这个着色器圆比传递的半径小这么多?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: