使用Three.js,我写了一个顶点着色器,它根据像素呈现的屏幕的哪个象限为平面上的每个点着色。在的jsfiddleThree.js - 根据屏幕上像素位置进行着色的顶点着色器
// vertex shader
uniform float width;
uniform float height;
varying float x;
varying float y;
void main()
{
vec4 v = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
x = v.x;
y = v.y;
gl_Position = v;
}
// fragment shader
varying float x;
varying float y;
void main()
{
gl_FragColor = vec4(x, y, 0.0, 1.0);
}
直播例如:http://jsfiddle.net/Stemkoski/ST4aM/
我想使得x
等于修改此着色器0在屏幕的左侧和1上的右侧屏幕上,同样y
等于顶部0和底部1。我(错误地)认为这将涉及将x
和y
的值更改为x = v.x/width
和y = v.y/height
(其中width
和height
存储窗口的宽度和高度)。然而,随着这种改变,在平面上放大和缩小时,每个屏幕像素处的颜色似乎都会改变。
如何修复着色器代码以获得所需的效果?
这对我来说不是很清楚你的意思是这是它吗? http://jsfiddle.net/ST4aM/2/ – WestLangley
我也没有很多线索,但atm,你的x已经在左边是零,在右边是1,不是吗?由于颜色是黑色和红色?如果你想让y在顶部为0,只需反转y-分量?顺便说一句。至于性能,将两个花车组合成一个vec2? :) btw:我在这里留下了一个关于你最后一个问题的“评论问题”,如果你能回答它,它会很酷:) – GuyGood
对不起,我似乎没有解释得这么好。 @WestLangley:你的改变可以修正飞机上的着色,但是我正在寻找相对于窗口/屏幕(而不是飞机)固定的模式。例如,屏幕右下角像素的颜色应该是r = 1,g = 0,b = 0,无论平面网格的哪个点位于其之外。基本上与我发布的jsFiddle效果相同,但屏幕上的颜色应该有平滑的渐变。 –