したがって、必要なのは単純です。シェーダーを実行するたびに(各ピクセルを意味します)、1
sと0
sのランダム行列を。で計算する必要がありresolution == originalImageResolution
ます。そのようなことをどのように行うのですか?
今のところ、shadertoy用に1つ作成しました。ランダム行列の解像度はここで15 x 15に設定されています。これは、200 x 200のようなものを試してみると、GPUによってクロムが頻繁に落ちるためですが、実際には完全な画像解像度サイズが必要です。
#ifdef GL_ES
precision highp float;
#endif
uniform vec2 resolution;
uniform float time;
uniform sampler2D tex0;
float rand(vec2 co){
return fract(sin(dot(co.xy ,vec2(12.9898,78.233))) * (43758.5453+ time));
}
vec3 getOne(){
vec2 p = gl_FragCoord.xy / resolution.xy;
vec3 one;
for(int i=0;i<15;i++){
for(int j=0;j<15;j++){
if(rand(p)<=0.5)
one = (one.xyz + texture2D(tex0,vec2(j,i)).xyz)/2.0;
}
}
return one;
}
void main(void)
{
gl_FragColor = vec4(getOne(),1.0);
}
そして、Adobeピクセルベンダー用のもの:
<languageVersion: 1.0;>
kernel random
< namespace : "Random";
vendor : "Kabumbus";
version : 3;
description : "not as random as needed, not as fast as needed"; >
{
input image4 src;
output float4 outputColor;
float rand(float2 co, float2 co2){
return fract(sin(dot(co.xy ,float2(12.9898,78.233))) * (43758.5453 + (co2.x + co2.y )));
}
float4 getOne(){
float4 one;
float2 r = outCoord();
for(int i=0;i<200;i++){
for(int j=0;j<200;j++){
if(rand(r, float2(i,j))>=1.0)
one = (one + sampleLinear(src,float2(j,i)))/2.0;
}
}
return one;
}
void
evaluatePixel()
{
float4 oc = getOne();
outputColor = oc;
}
}
だから私の本当の問題は-私のシェーダーが私のGPUダイバーを落とすということです。私が今しているのと同じ目的でGLSLを使用する方法はありますが、失敗することなく、可能であればより速くなりますか?
更新: 私が作成したいのはシングルピクセルカメラ(google CompressiveImagingまたはCompressiveSensing)と呼ばれ、GPUベースのソフトウェア実装を作成したいと思います。
アイデアは単純です:
- 画像があります-
NxM
。 - 画像のピクセルごとに、GPUに次の操作を実行させます。
NxM
ランダムな値の行列を生成する0
-sと1
s。- 座標がランダム行列のsの座標に対応する元の画像上のすべてのピクセルの算術平均を計算します
1
NxM
- 算術平均の出力結果をピクセルカラーとして出力します。
シェーダーに実装しようとしたのは、その慎重なプロセスをシミュレートすることでした。
GPUでこれを行おうとすると本当に愚かなことは何ですか?
- 圧縮センシングは
NxM
、そのような算術平均値の行列を計算するために私たちに背を向けることはありません、それはそれの平和を単に意味します(例えば1/3
)。そのため、GPUに必要のないプレッシャーをかけました。ただし、より多くのデータでテストすることは必ずしも悪い考えではありません。