從大湖街走到底的入口進去,可以看到刻著"清景大湖"的石頭~
沿著旁邊的階梯走上去,可以看到這樣的景色~感覺心曠神怡:)
為什麼叫小轉勒~因為路不是到了盡頭,而是該轉彎了~享受每一個當下吧!




void setShaders() {
char *vs = NULL,*fs = NULL,*fs2 = NULL;
f = glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
fs = textFileRead("sobel.frag");
const char * ff = fs;
glShaderSourceARB(f, 1, &ff,NULL);
free(fs);
glCompileShaderARB(f);
p = glCreateProgramObjectARB();
glAttachObjectARB(p,f);
glLinkProgramARB(p);
glUseProgramObjectARB(p);
}
uniform sampler2D tex;
float intensity(vec4 color){
return 0.299*color.r + 0.587*color.g + 0.114*color.b;
}
void main(){
vec4 a, p;
p.s=gl_TexCoord[0].s;
p.t=gl_TexCoord[0].t;
a=texture2D(tex,p.st);
float i = intensity(a);
gl_FragColor = vec4(i, i, i, 1);
}
最後來看怎麼在fragment shader中,將其利用sobel瞄出輪廓:
uniform sampler2D tex;
float intensity(vec4 color){
return 0.299*color.r + 0.587*color.g + 0.114*color.b;
}
float sobel(vec4 a1,vec4 a2,vec4 a3,vec4 a4,vec4 a5,vec4 a6,vec4 a7,vec4 a8,vec4 a9)
{
float X,Y;
vec3 y=vec3(a6.r-a4.r, a3.r-a1.r, a9.r-a7.r);
vec3 z=vec3(a2.r-a8.r, a3.r-a9.r, a1.r-a7.r);
X=2*y.x+y.y+y.z;
Y=2*z.x+z.y+z.z;
return (float)sqrt(X*X+Y*Y);
}
void main(){
vec4 a1,a2,a3,a4,a5,a6,a7,a8,a9;
vec4 p1,p2,p3,p4,p5,p6,p7,p8,p9;
vec2 c=vec2(1, 1);
p5.s=gl_TexCoord[0].s;
p5.t=gl_TexCoord[0].t;
a5=texture2D(tex,p5.st);
float i = intensity(a5);
p1.s=p5.s-c.s/(256);
p1.t=p5.t-c.t/(256);
p2.s=p5.s;
p2.t=p5.t-c.t/(256);
p3.s=p5.s+c.s/(256);
p3.t=p5.t-c.t/(256);
p4.s=p5.s-c.s/(256);
p4.t=p5.t;
p6.s=p5.s+c.s/(256);
p6.t=p5.t;
p7.s=p5.s-c.s/(256);
p7.t=p5.t+c.t/(256);
p8.s=p5.s;
p8.t=p5.t-c.t/(256);
p9.s=p5.s+c.s/(256);
p9.t=p5.t+c.t/(256);
a5=texture2D(tex,p5.st);
a1=texture2D(tex,p1.st);
a2=texture2D(tex,p2.st);
a3=texture2D(tex,p3.st);
a4=texture2D(tex,p4.st);
a6=texture2D(tex,p6.st);
a7=texture2D(tex,p7.st);
a8=texture2D(tex,p8.st);
a9=texture2D(tex,p9.st);
float j=sobel(a1,a2,a3,a4,a5,a6,a7,a8,a9);
gl_FragColor = vec4(j, j, j, 1);
}


glBegin(GL_POLYGON);
//
/*下面這綠色這兩行,作用是同時將GL_TEXTURE0和GL_TEXTURE1,assign給vertex*/
glMultiTexCoord3fARB(GL_TEXTURE0_ARB, 0.0, 1.0, 0.0);
glMultiTexCoord3fARB(GL_TEXTURE1_ARB, 0.0, 1.0, 0.0);
glVertex3f(1*size,1*size,1*size);
//
glMultiTexCoord3fARB(GL_TEXTURE0_ARB, 0.0, 0.0, 0.0);
glMultiTexCoord3fARB(GL_TEXTURE1_ARB, 0.0, 0.0, 0.0);
glVertex3f(1*size,-1*size,1*size);
//glMultiTexCoord3fARB(GL_TEXTURE0_ARB, 1.0, 0.0, 0.0);
glMultiTexCoord3fARB(GL_TEXTURE1_ARB, 1.0, 0.0, 0.0);
glVertex3f(-1*size,-1*size,1*size);
//
glMultiTexCoord3fARB(GL_TEXTURE0_ARB, 1.0, 1.0, 0.0);
glMultiTexCoord3fARB(GL_TEXTURE1_ARB, 1.0, 1.0, 0.0);
glVertex3f(-1*size,1*size,1*size);
glEnd();
void renderScene(void) {
glClear(GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT);
glUseProgram(p);
//tex1 & tex2 是在 fragment shader中宣告的uniform variable
//透過loc1 & loc2 來將讀取到的texture資訊,分別assign給tex1 & tex2
loc1 = glGetUniformLocation(p, "tex1");
loc2 = glGetUniformLocation(p, "tex2");
//下面這段,就是先讀取texture資訊,再透過loc1&loc2分別assign給tex1 & tex2
//其中TextureLoad是從openGL超級手冊的範例拿來用的function
//(懶的解釋每個fuction的用途 XD)
glActiveTexture(GL_TEXTURE0_ARB);
text1=TextureLoad("crate.bmp", GL_FALSE, GL_LINEAR, GL_LINEAR, GL_REPEAT);
glBindTexture(GL_TEXTURE_2D, text1);
glEnable(GL_TEXTURE_2D);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_REPLACE);
glUniform1i(loc1, 0);
glDisable(GL_TEXTURE_2D);
glActiveTexture(GL_TEXTURE1_ARB);
text2 = TextureLoad("GodTaiwan.bmp", GL_FALSE, GL_LINEAR, GL_LINEAR, GL_CLAMP);
glBindTexture(GL_TEXTURE_2D, text2);
glEnable(GL_TEXTURE_2D);
glTexEnvf (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE_EXT);
glTexEnvf (GL_TEXTURE_ENV, GL_COMBINE_RGB_EXT, GL_INCR);
glUniform1i(loc2, 1);
glLoadIdentity();
gluLookAt(5.0,0.0,0.0,
0.0,0.0,0.0,
0.0f,1.0f,0.0f);
glLightfv(GL_LIGHT0, GL_POSITION, lpos);
glRotatef(a,0,1,1);
drawBox(1);
a+=0.1;
glutSwapBuffers();
}
void main(void)
{
//用來使用貼圖的內建array
gl_TexCoord[0] = gl_MultiTexCoord0;
gl_TexCoord[1] = gl_MultiTexCoord1;
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}//用來讀取從外部傳入的texture的資訊的變數
uniform sampler2D tex1;
uniform sampler2D tex2;
void main (void)
{
//這....看也知道吧 XD........不然就咕狗囉
vec4 texval1 = texture2D(tex1, vec2(gl_TexCoord[0]));
vec4 texval2 = texture2D(tex2, vec2(gl_TexCoord[1]));
gl_FragColor = 0.5*(1.0*texval1 + 1.0*texval2);
}