「アルファブレンディング」の編集履歴(バックアップ)一覧はこちら
「アルファブレンディング」(2015/03/08 (日) 07:58:58) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
<p><strong>アルファブレンディングです。<br />
アルファブレンディングで注意しなければならない事があります。<br />
いかなるグラフィック描画でも基本的には一番最後に描画したものだけが表示されて、<br />
それまでにあった描画は全て上書きされてしまいます。<br />
ですが、3D描画ライブラリにはデプスバッファやZバッファがあり隠面消去を使うと手前のものは<br />
上書きされないようにすることができます。<br />
しかし、透明度のある物体を描画するときに隠面消去を使用すると本来は色が合成されて<br />
表示されるはずのものが隠面消去により、まるまる描画されなかったりします。<br />
それを解決するには、<br />
1.不透明なオブジェクトを描画<br />
2.半透明オブジェクトをZソート(視点からの奥行き順)<br />
3.半透明オブジェクトの、奥にあるものから描画<br />
という手順を踏む必要があります。<br />
今回のプログラムではスペースキーを押す度にブレンディング係数を切り替えます。</strong></p>
<p> <img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=76&file=alpha.png" /></p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br />
#pragma comment(lib, "glew32.lib")</p>
<p>#include <string><br />
#include <gl/glew.h><br />
#include <GL/freeglut/freeglut.h></p>
<p>using namespace std;</p>
<p>#define WIDTH 640<br />
#define HEIGHT 480</p>
<p>int Current=-1;<br />
string str="";</p>
<p><br />
void display(void)<br />
{<br />
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />
glMatrixMode(GL_MODELVIEW);<br />
glLoadIdentity();<br />
glViewport(0, 0, WIDTH, HEIGHT);<br />
gluPerspective(30.0, double(WIDTH)/HEIGHT, 0.1, 200);<br />
gluLookAt(0.0, 1.5, 3.0, 0.0 ,0.0 ,0.0, 0.0,1.0, 0.0);</p>
<p> glDisable(GL_DEPTH_TEST);//デプステストの無効化<br />
glEnable(GL_BLEND);//ブレンドの有効化</p>
<p> //奥の物から描画<br />
glTranslatef(0.0f,0.0f,-1.0f);<br />
glColor4f(0.0f, 0.0f, 1.0f, 0.5f);//青<br />
glRectf(-0.5,0.5,0.5,-0.5);<br />
<br />
glTranslatef(0.0f,0.0f,1.0f);<br />
glColor4f(1.f, 0.f, 0.f, 0.7f);//赤<br />
glRectf(-0.5,0.5,0.5,-0.5);</p>
<p> glDisable(GL_BLEND);<br />
glEnable(GL_DEPTH_TEST);</p>
<p> glutSwapBuffers();<br />
}</p>
<p>void key(unsigned char key , int x , int y) {<br />
if(key == ' '){//スペースキーで切り替え<br />
Current++;<br />
if(Current==6)Current=0;<br />
str="アルファブレンディング";<br />
if(Current==0){str+=":0 透明度無し描画";glBlendFunc(GL_ONE, GL_ZERO);}<br />
if(Current==1){str+=":1 半透明合成";glBlendFunc(GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA);}<br />
if(Current==2){str+=":2 加算合成";glBlendFunc(GL_SRC_ALPHA, GL_ONE);}<br />
if(Current==3){str+=":3 減算合成";<br />
glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT);<br />
glBlendFunc(GL_SRC_ALPHA, GL_ONE);}<br />
if(Current==4){str+=":4 乗算合成";<br />
glBlendEquationEXT(GL_FUNC_ADD_EXT);//glBlendEquationEXTを戻す<br />
glBlendFunc(GL_ZERO, GL_SRC_COLOR);}<br />
if(Current==5){str+=":5 反転合成";glBlendFunc(GL_ONE_MINUS_DST_COLOR,
GL_ZERO);}<br />
glutSetWindowTitle(str.c_str());<br />
glutPostRedisplay();<br />
}<br />
}</p>
<p>void idle(void)<br />
{<br />
glutPostRedisplay();<br />
}</p>
<p>void Init(){<br />
glewInit();<br />
glClearColor(0.5f, 0.5f, 0.5f, 1.f);<br />
glEnable(GL_DEPTH_TEST);<br />
key(' ',0,0);<br />
}</p>
<p>int main(int argc, char *argv[])<br />
{<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(WIDTH, HEIGHT);<br />
glutInit(&argc, argv);<br />
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />
glutCreateWindow("アルファブレンディング");<br />
glutDisplayFunc(display);<br />
glutKeyboardFunc(key);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return 0;<br />
}</p>
</td>
</tr></tbody></table><p> </p>
<p><strong>アルファブレンディングです。<br />
アルファブレンディングで注意しなければならない事があります。<br />
いかなるグラフィック描画でも基本的には一番最後に描画したものだけが表示されて、<br />
それまでにあった描画は全て上書きされてしまいます。<br />
ですが、3D描画ライブラリにはデプスバッファやZバッファがあり隠面消去を使うと手前のものは<br />
上書きされないようにすることができます。<br />
しかし、透明度のある物体を描画するときに隠面消去を使用すると本来は色が合成されて<br />
表示されるはずのものが隠面消去により、まるまる描画されなかったりします。<br />
それを解決するには、<br />
1.不透明なオブジェクトを描画<br />
2.半透明オブジェクトをZソート(視点からの奥行き順)<br />
3.半透明オブジェクトの、奥にあるものから描画<br />
という手順を踏む必要があります。<br />
今回のプログラムではスペースキーを押す度にブレンディング係数を切り替えます。</strong></p>
<p> <img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&act=open&pageid=76&file=alpha.png" style="height:255px;width:320px;" /></p>
<table border="1" cellpadding="1" cellspacing="1" style="width:100px;"><tbody><tr><td>ファイル</td>
</tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=76&file=main.cpp">
main.cpp</a></td>
</tr></tbody></table><p>main.cpp</p>
<table border="1" cellpadding="1" cellspacing="1" width="600"><tbody><tr><td>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br />
#pragma comment(lib, "glew32.lib")</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
#include <string><br />
#include <gl/glew.h><br />
#include <GL/freeglut/freeglut.h></p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
using namespace std;</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
#define WIDTH 640<br />
#define HEIGHT 480</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
int Current=-1;<br />
string str="";</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
<br />
void display(void)<br />
{<br />
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />
glMatrixMode(GL_MODELVIEW);<br />
glLoadIdentity();<br />
glViewport(0, 0, WIDTH, HEIGHT);<br />
gluPerspective(30.0, double(WIDTH)/HEIGHT, 0.1, 200);<br />
gluLookAt(0.0, 1.5, 3.0, 0.0 ,0.0 ,0.0, 0.0,1.0, 0.0);</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
glDisable(GL_DEPTH_TEST);//デプステストの無効化<br />
glEnable(GL_BLEND);//ブレンドの有効化</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
//奥の物から描画<br />
glTranslatef(0.0f,0.0f,-1.0f);<br />
glColor4f(0.0f, 0.0f, 1.0f, 0.5f);//青<br />
glRectf(-0.5,0.5,0.5,-0.5);<br />
<br />
glTranslatef(0.0f,0.0f,1.0f);<br />
glColor4f(1.f, 0.f, 0.f, 0.7f);//赤<br />
glRectf(-0.5,0.5,0.5,-0.5);</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
glDisable(GL_BLEND);<br />
glEnable(GL_DEPTH_TEST);</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
glutSwapBuffers();<br />
}</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
void key(unsigned char key , int x , int y) {<br />
if(key == ' '){//スペースキーで切り替え<br />
Current++;<br />
if(Current==6)Current=0;<br />
str="アルファブレンディング";<br />
if(Current==0){str+=":0 透明度無し描画";glBlendFunc(GL_ONE, GL_ZERO);}<br />
if(Current==1){str+=":1 半透明合成";glBlendFunc(GL_SRC_ALPHA,
GL_ONE_MINUS_SRC_ALPHA);}<br />
if(Current==2){str+=":2 加算合成";glBlendFunc(GL_SRC_ALPHA, GL_ONE);}<br />
if(Current==3){str+=":3 減算合成";<br />
glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT);<br />
glBlendFunc(GL_SRC_ALPHA, GL_ONE);}<br />
if(Current==4){str+=":4 乗算合成";<br />
glBlendEquationEXT(GL_FUNC_ADD_EXT);//glBlendEquationEXTを戻す<br />
glBlendFunc(GL_ZERO, GL_SRC_COLOR);}<br />
if(Current==5){str+=":5 反転合成";glBlendFunc(GL_ONE_MINUS_DST_COLOR,
GL_ZERO);}<br />
glutSetWindowTitle(str.c_str());<br />
glutPostRedisplay();<br />
}<br />
}</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
void idle(void)<br />
{<br />
glutPostRedisplay();<br />
}</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
void Init(){<br />
glewInit();<br />
glClearColor(0.5f, 0.5f, 0.5f, 1.f);<br />
glEnable(GL_DEPTH_TEST);<br />
key(' ',0,0);<br />
}</p>
<p style="margin:1em 0px;color:rgb(42,42,42);font-family:arial, helvetica, '繝偵Λ繧ョ繝手ァ偵ざ Pro W3', 'Hiragino Kaku Gothic Pro', Osaka, '繝。繧、繝ェ繧ェ', Meiryo, 'MS P繧エ繧キ繝�け', clean, sans-serif;font-size:12px;line-height:19.4559993743897px;">
int main(int argc, char *argv[])<br />
{<br />
glutInitWindowPosition(100, 100);<br />
glutInitWindowSize(WIDTH, HEIGHT);<br />
glutInit(&argc, argv);<br />
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />
glutCreateWindow("アルファブレンディング");<br />
glutDisplayFunc(display);<br />
glutKeyboardFunc(key);<br />
glutIdleFunc(idle);<br />
Init();<br />
glutMainLoop();<br />
return 0;<br />
}</p>
</td>
</tr></tbody></table><p> </p>