̃c[PsychlopsɂGLSLT|[geXgc[łB
ʉẼ{^QŔCӂGLSLvO[h邱Ƃł܂B
GLSL/fieldGratingȂǔCӂ̎̕`A
GLSL/imageŔCӂ̉摜ɑΉϊs܂B
PNG image[hGLSL/imageɓKp摜ւ邱Ƃł܂B
ʍ̕ϐ{bNXgp邱ƂŁAVF[_ւ̈iqjς邱Ƃł܂B


iӓ_j
OtBbNhCoɂGLSLRpC̎ɍ܂̂ŁA
zzOɂ͂mF܂悤肢܂B



//////// VF[_vȌ /////////

LqĂ@́AOpenGL2.0搂rfIJ[h̑ɍ킹邽߂ɍ쐬dlłB
A悢@ɕύX\ł̂ŁAPsychlops1.5.0ɂLq@ɂȂ܂B


Psychlopsł̃VF[_̗p݂͌̓sNZVF[_itOgVF[_ĵݗp܂B
́Aef̐F̒`Lq̂ŁAʏ̃vOŕKvȃ[v⃁bVObhKv͂܂B
ȉPsychlops/GLSLAPsychlops/C++APsychtoolbox/MatlabR[h͑łB

yPsychlops/GLSLz
void main(void){
  pix( sin(xp())/4.0+0.25 + sin(yp())/4.0+0.25 );
};

yPsychlops/C++z
Image img(100,100);
Color col;
for(int x=0; x<100; x++) {
  for(int y=0; y<100; y++) {
    img.pix(x,y, col.set( sin(x)/4.0+0.25 + sin(y)/4.0+0.25 ) );
  }
}

yPsychtoolbox/Matlabz
[x,y] = meshgrid(0:100, 0:100);
m = sin(x)/4.0+0.25 + sin(y)/4.0+0.25 );
Screen(window, 'PutImage', m);

RpCG[͉ʏɕ\قAst@CƓpXɂ"GLSLTesterErrorLog.txt"ɋL^܂B


//// ̎󂯎 ////


APsychlops̃VF[_vOł́Ae`Pʂւ̈
ȉ̋L@ɂn܂B

 (GLSL)
  in float contrast, frequency, orientation, phase;  //  main錾̒O"in float "ɑĈR}؂ŋLqAŌɃZ~RłĉsBŎw肵C++̔zɊi[B
  void main(void) {
  ...

 (C++)
  double arg[16];                           //  ni[zpӁBz񒷂4, 8, 12, 16̂ꂩŒB
  shader_field.draw(area_rect, arg, 4);     //  ShaderField / ShaderImagȇ2ŔzA3Ŕz/4wB


IɃeNX`WwoRĎ󂯎悤ϊ܂B
Psychlopsgp肠܂֌W܂񂪁A
gl_TexCoord[0]`[7]܂ł܂A[3]ȍ~Psychlopsgp܂B
܂AShaderImagegꍇ[0]gp܂B



//// {@ ////

GLSLTCg育mF肢܂B
http://www.opengl.org/documentation/glsl/



//// PsychlopsŒ`ĂGLSL֐ ////

const float PI; ~i萔j
const float E; lCsAi萔j

float xp() 摜_ƂxWisNZPʁj𓾂܂B
float yp() 摜_ƂyWisNZPʁj𓾂܂B
float rp() 摜S̋𓾂܂B
float thetaf() 摜S̊px𓾂܂B
float width() 摜̕𓾂܂B
float height() 摜̍𓾂܂B

void pix(in vec4 c); fɐFw肵܂B
void pix(in float l); 
void pix(in float l, in float a); 
void pix(in float r, in float g, in float b); 
void pix(in float r, in float g, in float b, in float a); 

vec4 getPix() ݏĂf̐F𓾂܂iShaderImagepj
vec4 getPix(in int x, in int y) W(x, y)̉f̐F𓾂܂iShaderImagepj
vec4 getPixOffset(in int x, in int y) ݏĂf(x, y)ꂽf̐F𓾂܂iShaderImagepj
