/*
** メイン関数
*/
int main( int argc, char *argv[] )
{
... 省略 ...
/* GLSLの初期設定 */
// init_glsl();
... 省略 ...
/* GLSLの終了設定 */
// fin_glsl();
... 省略 ...
}
/*
** ウィンドウの描画
*/
static void display( void )
{
/* 画面のクリア */
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
/* モデルビュー変換行列の初期化(単位行列にする) */
glLoadIdentity();
/* 視野変換(ビューイング変換)の設定 */
gluLookAt( 0.0, 0.0, 1.0, /* 視点位置 */
0.0, 0.0, 0.0, /* 注目位置 */
0.0, 1.0, 0.0 ); /* 上向きベクトル */
/* 4角形ポリゴンの描画 */
/* 4個の頂点にテクスチャ座標を割り当てる */
glBegin( GL_QUADS );
glTexCoord2d( 0.0, 0.0 );
glVertex3d( 0.0, 0.0, 0.0 );
glTexCoord2d( 1.0, 0.0 );
glVertex3d( (GLdouble)imgx, 0.0, 0.0 );
glTexCoord2d( 1.0, 1.0 );
glVertex3d( (GLdouble)imgx, (GLdouble)imgy, 0.0 );
glTexCoord2d( 0.0, 1.0 );
glVertex3d( 0.0, (GLdouble)imgy, 0.0 );
glEnd();
/* ダブルバッファリング */
glutSwapBuffers();
}
|
[ x, y, z ] |
[ s, t ] |
||
| [ 0.0, imgy, 0.0 ] | [ imgx, imgy, 0.0 ] | [ 0.0, 1.0 ] | [ 1.0, 1.0 ] |
| [ 0.0, 0.0, 0.0 ] | [ imgx, 0.0, 0.0 ] | [ 0.0, 0.0 ] | [ 1.0, 0.0 ] |
/*
** メイン関数
*/
int main( int argc, char *argv[] )
{
... 省略 ...
/* GLSLの初期設定 */
init_glsl(); /* コメント記号 // を外して有効にする */
... 省略 ...
/* GLSLの終了設定 */
fin_glsl(); /* コメント記号 // を外して有効にする */
... 省略 ...
}
/*
** GLSLの初期設定
*/
static void init_glsl( void )
{
... 省略 ...
/* フラグメントシェーダに値を渡す */
GLint smptexLoc = glGetUniformLocation( gl2Program, "smptex" ); // テクスチャサンプラ
glUniform1i( smptexLoc, 0 ); // テクスチャユニット GL_TEXTURE0 を利用
GLint imgxLoc = glGetUniformLocation( gl2Program, "imgx" ); // 画像の x 方向のピクセル数
glUniform1i( imgxLoc, imgx );
GLint imgyLoc = glGetUniformLocation( gl2Program, "imgy" ); // 画像の y 方向のピクセル数
glUniform1i( imgyLoc, imgy );
}
/*
** ウィンドウの描画
*/
static void display( void )
{
... 省略 ...
/* 4角形ポリゴンの描画 */
/* 4個の頂点にテクスチャ座標を割り当てる */
glBegin( GL_QUADS );
// glTexCoord2d( 0.0, 0.0 ); /* コメントアウトして無効にする */
glVertex3d( 0.0, 0.0, 0.0 );
// glTexCoord2d( 1.0, 0.0 ); /* コメントアウトして無効にする */
glVertex3d( (GLdouble)imgx, 0.0, 0.0 );
// glTexCoord2d( 1.0, 1.0 ); /* コメントアウトして無効にする */
glVertex3d( (GLdouble)imgx, (GLdouble)imgy, 0.0 );
// glTexCoord2d( 0.0, 1.0 ); /* コメントアウトして無効にする */
glVertex3d( 0.0, (GLdouble)imgy, 0.0 );
glEnd();
... 省略 ...
}
|
void main( void )
{
// 頂点のクリッピング座標
// gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// 上と下は同じ働きをする
gl_Position = ftransform();
}
|
// OpenGLアプリケーションの値を受け取る uniform 変数
uniform sampler2D smptex; // テクスチャサンプラ
uniform int imgx; // 画像の x 方向のピクセル数
uniform int imgy; // 画像の y 方向のピクセル数
void main ( void )
{
vec2 tex_st;
vec4 col;
// テクスチャ座標値の計算
tex_st.s = gl_FragCoord.x / float( imgx ); // 0.0 <= tex_st.s <= 1.0
tex_st.t = gl_FragCoord.y / float( imgy ); // 0.0 <= tex_st.t <= 1.0
// テクスチャの色のサンプリング
col = texture2D( smptex, tex_st );
// フラグメントの色
gl_FragColor.rgb = col.rgb;
}
|
/*
** ウィンドウの描画
*/
static void display( void )
{
... 省略 ...
/* 視野変換(ビューイング変換)の設定 */
gluLookAt( 0.0, 0.0, 1.0, /* 視点位置 */
0.0, 0.0, 0.0, /* 注目位置 */
0.0, 1.0, 0.0 ); /* 上向きベクトル */
/* モデリング変換 */
glTranslated( (GLdouble)imgx/3.0, (GLdouble)imgy/6.0, 0.0 );
glRotated( 30.0, 0.0, 0.0, 1.0 );
glScaled( 0.5, 0.5, 1.0 );
/* 4角形ポリゴンの描画 */
/* 4個の頂点にテクスチャ座標を割り当てる */
glBegin( GL_QUADS );
... 省略 ...
}
|
モデリング変換なし |
OpenGLアプリケーションのみを利用 |
シェーダを利用 |
![]() |
![]() |
![]() |
// フラグメントシェーダに渡す値を格納するvarying変数
varying vec2 vert_xy; // 4角形ポリゴンのモデリング座標の x, y 値
void main( void )
{
// 頂点のクリッピング座標
// gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
// 上と下は同じ働きをする
gl_Position = ftransform();
// 頂点のモデリング座標の x, y 値
vert_xy.xy = gl_Vertex.xy;
}
|
// OpenGLアプリケーションの値を受け取るuniform変数
uniform sampler2D smptex; // テクスチャサンプラ
uniform int imgx; // 画像のx方向のピクセル数
uniform int imgy; // 画像のy方向のピクセル数
// バーテックスシェーダから渡される値を格納するvarying変数
varying vec2 vert_xy; // 4角形ポリゴンのモデリング座標の x, y 値
void main ( void )
{
vec2 tex_st;
vec4 col;
// テクスチャ座標値の計算
// tex_st.s = gl_FragCoord.x / float( imgx ); // 0.0 <= tex_st.s <= 1.0
// tex_st.t = gl_FragCoord.y / float( imgy ); // 0.0 <= tex_st.t <= 1.0
tex_st.s = vert_xy.x / float( imgx ); // 0.0 <= tex_st.s <= 1.0
tex_st.t = vert_xy.y / float( imgy ); // 0.0 <= tex_st.t <= 1.0
// テクスチャの色のサンプリング
col = texture2D( smptex, tex_st );
// フラグメントの色
gl_FragColor.rgb = col.rgb;
}
|
モデリング変換なし |
OpenGLアプリケーションのみを利用 |
フラグメント座標値 gl_FragCoord を利用 |
モデリング座標値 gl_Vertex を利用 |
![]() |
![]() |
![]() |
![]() |
/*
** メイン関数
*/
int main( int argc, char *argv[] )
{
/* 画像の読み込み */
if( getPPM( imgname, &imgx, &imgy, img ) != 0 ) {
fprintf( stderr, "error: main() -> getPPM() -> %s\n", imgname );
return( 1 );
}
/* 【実験】シェーダの利用による処理の高速化 (2ー1) */
int num = 10000; // 繰り返し回数
float avg, sum;
for( int y = 0; y < imgy; y++ ) {
for( int x = 0; x < imgx; x++ ) {
avg = ( ((float)img[imgx*y+x][0]/255.0)
+ ((float)img[imgx*y+x][1]/255.0)
+ ((float)img[imgx*y+x][2]/255.0) ) / 3.0;
sum = 0.0;
for( int n = 0; n < num; n++ ) {
sum += avg;
}
img[imgx*y+x][0] = img[imgx*y+x][1] = img[imgx*y+x][2]
= (unsigned char)( (sum/(float)num)*255.0 );
}
}
/* OpenGLの初期化 */
glutInitWindowSize( imgx, imgy );
... 省略 ...
/* GLSLの初期設定 */
// init_glsl();
... 省略 ...
/* GLSLの終了設定 */
// fin_glsl();
... 省略 ...
}
|
/*
** メイン関数
*/
int main( int argc, char *argv[] )
{
/* 画像の読み込み */
if( getPPM( imgname, &imgx, &imgy, img ) != 0 ) {
fprintf( stderr, "error: main() -> getPPM() -> %s\n", imgname );
return( 1 );
}
/* 【実験】シェーダの利用による処理の高速化 (2ー1) */
/* int num = 10000; // 繰り返し回数
float avg, sum;
for( int y = 0; y < imgy; y++ ) {
for( int x = 0; x < imgx; x++ ) {
avg = ( ((float)img[imgx*y+x][0]/255.0)
+ ((float)img[imgx*y+x][1]/255.0)
+ ((float)img[imgx*y+x][2]/255.0) ) / 3.0;
sum = 0.0;
for( int n = 0; n < num; n++ ) {
sum += avg;
}
img[imgx*y+x][0] = img[imgx*y+x][1] = img[imgx*y+x][2]
= (unsigned char)( (sum/(float)num)*255.0 );
}
} */
/* OpenGLの初期化 */
glutInitWindowSize( imgx, imgy );
... 省略 ...
/* GLSLの初期設定 */
init_glsl(); /* コメント記号 // を外して有効にする */
... 省略 ...
/* GLSLの終了設定 */
fin_glsl(); /* コメント記号 // を外して有効にする */
... 省略 ...
}
/*
** ウィンドウの描画
*/
static void display( void )
{
... 省略 ...
/* 4角形ポリゴンの描画 */
/* 4個の頂点にテクスチャ座標を割り当てる */
glBegin( GL_QUADS );
// glTexCoord2d( 0.0, 0.0 ); /* コメントアウトして無効にする */
glVertex3d( 0.0, 0.0, 0.0 );
// glTexCoord2d( 1.0, 0.0 ); /* コメントアウトして無効にする */
glVertex3d( (GLdouble)imgx, 0.0, 0.0 );
// glTexCoord2d( 1.0, 1.0 ); /* コメントアウトして無効にする */
glVertex3d( (GLdouble)imgx, (GLdouble)imgy, 0.0 );
// glTexCoord2d( 0.0, 1.0 ); /* コメントアウトして無効にする */
glVertex3d( 0.0, (GLdouble)imgy, 0.0 );
glEnd();
... 省略 ...
}
|
void main ( void )
{
... 省略 ...
// テクスチャの色のサンプリング
col = texture2D( smptex, tex_st );
/* 【実験】シェーダの利用による処理の高速化 (2ー2) */
int num = 10000; // 繰り返し回数
float avg, sum;
avg = ( col.r + col.g + col.b ) / 3.0;
sum = 0.0;
for( int n = 0; n < num; n++ ) {
sum += avg;
}
col.r = col.g = col.b = (sum/float(num));
// フラグメントの色
gl_FragColor.rgb = col.rgb;
}
|
OpenGLアプリケーションのみを利用 |
シェーダを利用 |
|
![]() |
![]() |
![]() |
|
|
void main ( void )
{
int i, j;
vec4 col; // サンプリングしたテクスチャ色
vec3 avg = vec3( 0.0 ); // テクスチャ色の平均値
int m = 1; // 平滑化するピクセルの範囲
float w[9] // 重み w[(2*m+1)*(2*m+1)]
= float[9]( 0.1, 0.1, 0.1,
0.1, 0.2, 0.1,
0.1, 0.1, 0.1 );
... 省略 ...
for( j = -m; j <= m; j++ ) {
for( i = -m; i <= m; i++ ) {
... 省略 ...
// 変数 col にピクセル [ i, j ] について
// サンプリングしたテクスチャ色が入っているものとする.
avg.rgb += ( w[(2*m+1)*(m+j)+(m+i)] * col.rgb );
... 省略 ...
}
}
... 省略 ...
// フラグメントの色
gl_FragColor.rgb = avg.rgb;
}
|
|
|
|
|