这是正常的,在不知道坐标系的情况下无法在blender中重现这段代码。
The Shadertoy documentation states:
图像着色器实现 mainImage() 函数来生成
通过计算图像中每个像素的颜色来生成程序图像。
此函数在每个像素和主机应用程序中调用一次
必须提供适当的输入数据并检索输出颜色
将其分配给屏幕上的相应像素。签名
这个函数是:
void mainImage(out vec4 fragColor, in vec2 fragCoord);
其中 fragCoord 包含像素的坐标,
着色器必须计算颜色。这些坐标以像素为单位
整个渲染过程中的值从 0.5 到 resolution-0.5
表面和该表面的分辨率传输到
着色器通过统一 iResolution 变量。
让我解释一下。
iResolution 变量是一个 uniform vec3,它包含窗口的尺寸,并通过一些 openGL 代码发送到着色器。
fragCoord 变量是一个内置变量,其中包含应用着色器的像素坐标。
更具体地说:
-
fragCoord :是一个
vec2,在 X 轴上 0 > 640 和 Y 轴上 0 > 360 之间
-
iResolution:是一个
vec2,X 值为 640,Y 值为 360
关于向量如何在 OpenGL 中工作的快速说明:
- 如果您也很难理解矢量在 OpenGL 中的工作原理,我强烈建议您阅读下面的 Homan 的回答,这是对 OpenGL swizzling 的非常有用的介绍。
这张图片是用下面的代码计算出来的:
// Normalized pixel coordinates (between 0 and 1)
vec2 uv = fragCoord/iResolution.xy;
// Set R and G values based on position
vec3 col = vec3(uv.x,uv.y,0);
// Output to screen
fragColor = vec4(col,1.0);
输出范围从左下角的0,0 和右上角的1,1。这是 OpenGL 设置的默认左下窗口空间。
此图像是使用以下代码计算得出的:
// Normalized pixel coordinates (between -0.5 and 0.5)
vec2 uv = (fragCoord - iResolution.xy * 0.5)/iResolution.xy;
// Set R and G values based on position
vec3 col = vec3(uv.x,uv.y,0);
// Output to screen
fragColor = vec4(col,1.0);
输出范围从左下角的-0.5,-0.5 到0.5,0.5,因为
在第一步中,我们从每个像素坐标 [fragCoord] 中减去一半的窗口大小 [0.5]。您可以看到效果,因为红色和绿色值直到很久以后才会出现。
您可能还想通过将第一步更改为
来
仅标准化 y 轴
vec2 uv = (fragCoord - iResolution.xy * 0.5)/iResolution.y;
根据您的目的,如果您对两个轴进行归一化,图像可能看起来很奇怪,因此这是一种可能的策略。
这张图片是用下面的代码计算出来的:
// Normalized pixel coordinates (between -0.5 to 0.5)
vec2 uv = (fragCoord - iResolution.xy * 0.5)/iResolution.xy;
// Set R and G values based on position using ceil() function
// The ceil() function returns the smallest integer that is greater than the uv value
vec3 col = vec3(ceil(uv.x),ceil(uv.y),0);
// Output to screen
fragColor = vec4(col,1.0);
ceil()函数可以让我们看到图片的中心是0, 0
关于shadertoy文档的第二部分:
输出颜色在 fragColor 中作为四分量向量返回,
客户端忽略的最后一个组件。结果是
在预期未来添加的“out”变量中检索
几个渲染目标。
这实际上意味着fragColor 包含四个值,这些值被存储到渲染管道的下一个阶段。 You can find more about in and out variables here.
fragColor 中的值决定了应用着色器的像素的颜色。
如果您想了解有关着色器的更多信息,以下是一些不错的起点:
the book of shader - uniform
learn OpenGL - shader