所以我需要的很简单:每次我们执行着色器(每个像素的意思)时,我都需要计算1
s 和0
s 的随机矩阵resolution == originalImageResolution
。怎么做这样的事情?
至于现在我已经创建了一个shadertoy随机矩阵分辨率在这里设置为15 x 15,因为当我尝试像200 x 200这样的东西时,gpu会使chrome经常下降,而我真的需要完整的图像分辨率大小
#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 Compressive Imaging 或 Compressive Sensing),我想创建基于 gpu 的软件实现。
想法很简单:
- 我们有一个图像 -
NxM
。 - 对于图像中的每个像素,我们希望 GPU 执行以下操作:
- 生成
NxM
随机值矩阵 -0
s 和1
s。 - 计算原始图像上所有像素的算术平均值,其坐标对应
1
于随机NxM
矩阵中 s 的坐标 - 算术平均值的输出结果为像素颜色。
- 生成
我试图在我的着色器中实现的是模拟那个谨慎的过程。
尝试在 gpu 上执行此操作真的很愚蠢:
- 压缩传感并不要求我们计算
NxM
这种算术平均值的矩阵,它只需要它的和平(例如1/3
)。所以我给GPU施加了一些我不需要的压力。然而,对更多数据进行测试并不总是一个坏主意。