使用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效果相同,但屏幕上的顏色應該有平滑的漸變。 –