gpt4 book ai didi

opengl - 纹理扭曲着色器 : Polar to Rectangular Coordinates

转载 作者:行者123 更新时间:2023-12-01 15:30:23 25 4
gpt4 key购买 nike

我正在使用 OpenGL 编写 2D 游戏,并且我计划了一种阴影转换算法,该算法需要将纹理从极坐标转换为矩形坐标。想要的效果如下:

由此:

enter image description here

对此:

enter image description here

我知道在极坐标系统和矩形系统之间转换坐标的公式,但是我在编写着色器以达到预期效果时遇到了问题。

我的着色器接收一个纹理作为输入,并且应该将扭曲的纹理绘制到屏幕上。我计划了以下内容(知道片段着色器一次作用于一个片段):

  • 使用 gl_FragCoord.xy
  • 查找当前片段的坐标
  • 确定对应于点 (x, y) 的 r 和 theta。
  • 将 r 和 theta 转换为 texture_x 和 texture_y(将用于对纹理进行采样)
  • 将采样像素转移到当前片段

  • 我的最终结果是相同的输入纹理顺时针旋转 90 度。我认为我在第 3 步中遗漏了一些东西。我可能只是获得了当前片段的相同 x 和 y,因为我只是同时使用了变换和逆变换公式。
    我应该如何继续获得预期的结果?

    这是我的着色器:
    #version 120

    uniform sampler2D tex;

    void main() {

    vec2 fragCoords = gl_FragCoord.xy - vec2(128, 128); //shift the coordinates so that 0, 0 is in the center of the screen (the final texture is 256 * 256)
    fragCoords /= vec2(256, 256);
    float r = sqrt(pow(fragCoords.x, 2) + pow(fragCoords.y, 2));
    float theta = atan(fragCoords.y, fragCoords.x);

    if (fragCoords.y/fragCoords.x <= 0.5 && fragCoords.y/fragCoords.x >= -0.5) {
    r *= 1/(256*sin(theta));
    } else {
    r *= 1/(0.5*256*cos(theta));
    }

    vec2 texCoords = vec2(r, theta);
    vec4 texFrag = texture2D(tex, texCoords);

    gl_FragColor = texFrag * vec4(1.0, 0.0, 0.0, 1.0);
    }

    最佳答案

    在您的着色器中,您首先要转换为极坐标

    float r = sqrt(pow(fragCoords.x, 2) + pow(fragCoords.y, 2));
    float theta = atan(fragCoords.y, fragCoords.x);

    然后你不把它们翻译回笛卡尔
    float tX = r * sin(theta); 
    float tY = r * cos(theta);

    你想留在极坐标,所以只需插入 rtheta进入纹理坐标
    vec2 texCoords = vec2(r , theta);
    vec4 texFrag = texture2D(tex, texCoords);

    但是,从您粘贴的图像的外观来看,涉及到一些重整化步骤,因此 (r, theta)将覆盖一个矩形区域。如果我没有完全弄错,那么 r 是按射线从中心底部与矩形区域相交的距离来缩放的。如果我们假设 theta=0 是直线上升,那么对于范围 [-atan(0.5)…atan(0.5)],它按 1/(height*sin(theta)) 缩放,在该范围之外按 1/(0.5*宽度*cos(theta))

    关于opengl - 纹理扭曲着色器 : Polar to Rectangular Coordinates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21495002/

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