我正在使用OpenGL编写一个2D游戏,计划使用一个阴影投射算法,需要将纹理从极坐标系转换为矩形坐标系。期望的效果如下图所示:
我知道如何在极坐标系和矩形坐标系之间进行坐标转换,但是在编写着色器以实现所需效果方面遇到了问题。
我的着色器接收一个纹理作为输入,并应该将扭曲的纹理绘制到屏幕上。我安排了以下步骤(知道片段着色器每次只对一个片段进行操作):
- 使用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);
}