/* ** 初期化 */ static void init(void) { ... 省略 ... /* 初期設定 */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /* 背景を白にする */ ... 省略 ... /* 光源の初期設定 */ // glEnable(GL_LIGHTING); /* 光源を無効化 */ ... 省略 ... /* シェーダプログラムの適用 */ // glUseProgram(gl2Program); glUseProgram(0); /* シェーダプログラムの適用を無効化 */ } /* ** シーンの描画 */ static void scene(void) { static const GLfloat diffuse[] = { 0.6f, 0.1f, 0.1f, 1.0f }; static const GLfloat specular[] = { 0.3f, 0.3f, 0.3f, 1.0f }; /* 材質の設定 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0f); #if 1 /* 1枚の4角形を描く */ glNormal3d(0.0, 0.0, 1.0); glBegin(GL_QUADS); glColor3d(1.0, 0.0, 0.0); /* 赤 */ glVertex3d(-1.0, -1.0, 0.0); glColor3d(0.0, 1.0, 0.0); /* 緑 */ glVertex3d( 1.0, -1.0, 0.0); glColor3d(0.0, 0.0, 1.0); /* 青 */ glVertex3d( 1.0, 1.0, 0.0); glColor3d(1.0, 1.0, 0.0); /* 黄 */ glVertex3d(-1.0, 1.0, 0.0); glEnd(); #else glutSolidTeapot(1.0); #endif } |
/* ** 初期化 */ static void init(void) { ... 省略 ... /* 初期設定 */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /* 背景を白にする */ ... 省略 ... /* 光源の初期設定 */ // glEnable(GL_LIGHTING); /* 光源を無効化 */ ... 省略 ... /* シェーダプログラムの適用 */ glUseProgram(gl2Program); /* シェーダプログラムの適用を有効化 */ } /* ** シーンの描画 */ static void scene(void) { static const GLfloat diffuse[] = { 0.6f, 0.1f, 0.1f, 1.0f }; static const GLfloat specular[] = { 0.3f, 0.3f, 0.3f, 1.0f }; /* 材質の設定 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0f); #if 1 /* 1枚の4角形を描く */ glNormal3d(0.0, 0.0, 1.0); glBegin(GL_QUADS); glColor3d(1.0, 0.0, 0.0); /* 赤 */ glVertex3d(-1.0, -1.0, 0.0); glColor3d(0.0, 1.0, 0.0); /* 緑 */ glVertex3d( 1.0, -1.0, 0.0); glColor3d(0.0, 0.0, 1.0); /* 青 */ glVertex3d( 1.0, 1.0, 0.0); glColor3d(1.0, 1.0, 0.0); /* 黄 */ glVertex3d(-1.0, 1.0, 0.0); glEnd(); #else glutSolidTeapot(1.0); #endif } |
void main(void) { // 頂点位置 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // 頂点色 gl_FrontColor = vec4(1.0, 0.0, 0.0, 1.0); /* 【実験1】直接的に与えた色(赤) */ // gl_FrontColor = gl_Color; /* 【実験2】OpenGLアプリケーションから渡された色 */ // gl_FrontColor = vec4(1.0) - gl_Color; /* 【実験3】OpenGLアプリケーションから渡された色の反転色 */ } |
void main (void) { // フラグメントの色 // gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); gl_FragColor = gl_Color; /* バーテックスシェーダから渡された色 */ } |
/* ** 初期化 */ static void init(void) { ... 省略 ... /* 初期設定 */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /* 背景を白にする */ ... 省略 ... /* 光源の初期設定 */ // glEnable(GL_LIGHTING); /* 光源を無効化 */ ... 省略 ... /* シェーダプログラムの適用 */ glUseProgram(gl2Program); } /* ** シーンの描画 */ static void scene(void) { static const GLfloat diffuse[] = { 0.6f, 0.1f, 0.1f, 1.0f }; static const GLfloat specular[] = { 0.3f, 0.3f, 0.3f, 1.0f }; /* バーテックスシェーダに渡す値 */ float valVertC = 0.0; GLint valVertLoc; /* バーテックスシェーダに値を渡す */ valVertLoc = glGetUniformLocation(gl2Program, "valVert"); glUniform1f(valVertLoc, valVertC); /* 材質の設定 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0f); #if 1 /* 1枚の4角形を描く */ glNormal3d(0.0, 0.0, 1.0); glBegin(GL_QUADS); glColor3d(1.0, 0.0, 0.0); /* 赤 */ glVertex3d(-1.0, -1.0, 0.0); glColor3d(0.0, 1.0, 0.0); /* 緑 */ glVertex3d( 1.0, -1.0, 0.0); glColor3d(0.0, 0.0, 1.0); /* 青 */ glVertex3d( 1.0, 1.0, 0.0); glColor3d(1.0, 1.0, 0.0); /* 黄 */ glVertex3d(-1.0, 1.0, 0.0); glEnd(); #else glutSolidTeapot(1.0); #endif } |
uniform float valVert; /* OpenGLアプリケーションから渡される値を格納する変数 */ void main(void) { // 頂点位置 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // 頂点色 if( gl_Vertex.x < valVert ) { /* 【実験1】モデリング座標値 gl_Vertex と比較 */ // if( gl_Position.x < valVert ) { /* 【実験2】クリッピング座標値 gl_Position と比較 */ gl_FrontColor = vec4(1.0, 0.0, 0.0, 1.0); /* 赤 */ } else { gl_FrontColor = vec4(0.0, 1.0, 0.0, 1.0); /* 緑 */ } } |
void main (void) { // フラグメントの色 // gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); gl_FragColor = gl_Color; /* バーテックスシェーダから渡された色 */ } |
→ | → | → | |||||
説明図 | → | → | → | ||||
実験1 | → | → | → | ||||
実験2 | → | → | → |
/* ** 初期化 */ static void init(void) { ... 省略 ... /* 初期設定 */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /* 背景を白にする */ ... 省略 ... /* 光源の初期設定 */ // glEnable(GL_LIGHTING); /* 光源を無効化 */ ... 省略 ... /* シェーダプログラムの適用 */ glUseProgram(gl2Program); } /* ** シーンの描画 */ static void scene(void) { static const GLfloat diffuse[] = { 0.6f, 0.1f, 0.1f, 1.0f }; static const GLfloat specular[] = { 0.3f, 0.3f, 0.3f, 1.0f }; /* フラグメントシェーダに渡す値 */ float valFragC = 150.0; GLint valFragLoc; /* フラグメントシェーダに値を渡す */ valFragLoc = glGetUniformLocation(gl2Program, "valFrag"); glUniform1f(valFragLoc, valFragC); /* 材質の設定 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0f); #if 1 /* 1枚の4角形を描く */ glNormal3d(0.0, 0.0, 1.0); glBegin(GL_QUADS); glColor3d(1.0, 0.0, 0.0); /* 赤 */ glVertex3d(-1.0, -1.0, 0.0); glColor3d(0.0, 1.0, 0.0); /* 緑 */ glVertex3d( 1.0, -1.0, 0.0); glColor3d(0.0, 0.0, 1.0); /* 青 */ glVertex3d( 1.0, 1.0, 0.0); glColor3d(1.0, 1.0, 0.0); /* 黄 */ glVertex3d(-1.0, 1.0, 0.0); glEnd(); #else glutSolidTeapot(1.0); #endif } |
void main(void) { // 頂点位置 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; } |
uniform float valFrag; /* OpenGLアプリケーションから渡される値を格納する変数 */ void main (void) { // フラグメントの色 // gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); if( gl_FragCoord.x < valFrag ) { /* フラグメント(ピクセル)座標値 gl_FragCoord と比較 */ gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0); /* 黄 */ } else { gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0); /* 紫 */ } } |
→ | → | → | |||||
説明図 | → | → | → | ||||
実験 | → | → | → |
/* ** 初期化 */ static void init(void) { ... 省略 ... /* 初期設定 */ glClearColor(1.0f, 1.0f, 1.0f, 1.0f); /* 背景を白にする */ ... 省略 ... /* 光源の初期設定 */ // glEnable(GL_LIGHTING); /* 光源を無効化 */ ... 省略 ... /* シェーダプログラムの適用 */ glUseProgram(gl2Program); } /* ** シーンの描画 */ static void scene(void) { static const GLfloat diffuse[] = { 0.6f, 0.1f, 0.1f, 1.0f }; static const GLfloat specular[] = { 0.3f, 0.3f, 0.3f, 1.0f }; /* フラグメントシェーダに渡す値 */ float valFragC = 150.0; GLint valFragLoc; /* フラグメントシェーダに値を渡す */ valFragLoc = glGetUniformLocation(gl2Program, "valFrag"); glUniform1f(valFragLoc, valFragC); /* 材質の設定 */ glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, diffuse); glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular); glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, 100.0f); #if 1 /* 1枚の4角形を描く */ glNormal3d(0.0, 0.0, 1.0); glBegin(GL_QUADS); glColor3d(1.0, 0.0, 0.0); /* 赤 */ glVertex3d(-1.0, -1.0, 0.0); glColor3d(0.0, 1.0, 0.0); /* 緑 */ glVertex3d( 1.0, -1.0, 0.0); glColor3d(0.0, 0.0, 1.0); /* 青 */ glVertex3d( 1.0, 1.0, 0.0); glColor3d(1.0, 1.0, 0.0); /* 黄 */ glVertex3d(-1.0, 1.0, 0.0); glEnd(); #else glutSolidTeapot(1.0); #endif } |
varying float addxy; /* フラグメントシェーダに渡す値を格納する変数 */ void main(void) { // 頂点位置 gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; // フラグメントシェーダに渡す値 addxy = ( ( gl_Vertex.x + gl_Vertex.y ) + 2.0 ) / 4.0; /* 【実験1】モデリング座標値 gl_Vertex を利用 */ // addxy = ( ( gl_Position.x + gl_Position.y ) + 2.0 ) / 4.0; /* 【実験2】クリッピング座標値 gl_Position を利用 */ } |
uniform float valFrag; /* OpenGLアプリケーションから渡される値を格納する変数 */ varying float addxy; /* バーテックスシェーダから渡される値を格納する変数 */ void main (void) { // フラグメントの色 // gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0); if( gl_FragCoord.x < valFrag ) { /* ピクセル座標値 gl_FragCoord と比較 */ gl_FragColor = vec4(1.0, 1.0, 0.0, 1.0) * addxy; /* 黄 */ } else { gl_FragColor = vec4(1.0, 0.0, 1.0, 1.0) * addxy; /* 紫 */ } } |
→ | → | → | |||||
説明図 | → | → | → | ||||
実験1 | → | → | → | ||||
実験2 | → | → | → |