Так что мне нужно просто: каждый раз, когда мы выполняем наш шейдер (то есть для каждого пикселя), мне нужно вычислять случайную матрицу 1
s и 0
s с resolution == originalImageResolution
. Как это сделать?
На данный момент я создал один для shadertoy, разрешение случайной матрицы здесь установлено как 15 на 15. потому что графический процессор заставляет хром часто падать, когда я пробую такие вещи, как 200 на 200, хотя мне действительно нужен размер полного разрешения изображения
#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 Pixel Bender:
<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;
}
}
Итак, моя настоящая проблема в том, что мои шейдеры приводят к падению моего графического процессора. Как использовать GLSL для той же цели, что и я, но без сбоев и, если возможно, быстрее?
Обновление: то, что я хочу создать, называется однопиксельным Камера (google Compressive Imaging или Compressive Sensing), я хочу создать программную реализацию на основе графического процессора.
Идея проста:
- у нас есть изображение -
NxM
. - for each pixel in image we want GPU to performe the next operations:
- to generate
NxM
matrix of random values -0
s and1
s. - вычислить среднее арифметическое всех пикселей исходного изображения, координаты которых соответствуют координатам
1
s в нашем случайномNxM
матрица - вывести результат среднего арифметического в виде цвета пикселя.
- to generate
В своих шейдерах я пытался имитировать этот осторожный процесс.
Что на самом деле глупо пытаться сделать это на gpu:
- Compressive Sensing не требует от нас вычислять
NxM
матрицу таких средних арифметических значений, он требует лишь небольшого количества этого (например,1/3
). Так что я оказываю давление на GPU, которое мне не нужно. Однако тестирование большего количества данных - не всегда плохая идея.