PBO

「PBO」の編集履歴(バックアップ)一覧はこちら

PBO」(2015/05/06 (水) 18:18:35) の最新版変更点

追加された行は緑色になります。

削除された行は赤色になります。

<p><strong>PBOです。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=292&amp;file=pbo.png" style="width:336px;height:279px;" /></strong></p> <table border="1" cellpadding="1" cellspacing="1" style="width:600px;"><tbody><tr><td> <p>#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")<br /> #pragma comment(lib,"glew32.lib")</p> <p>#include &lt;gl/glew.h&gt;<br /> #include &lt;GL/freeglut/freeglut.h&gt;</p> <p><br /> #define WIDTH 320<br /> #define HEIGHT 240</p> <p>struct ImageData{<br />     int width;<br />     int height;<br />     int Channels;<br />     unsigned char *imageData;<br /> }Image = {512,512,4,0};</p> <p>int a=0;<br /> GLuint texId;//テクスチャ用ID<br /> GLuint PboId[2];//PBO用ID</p> <p><br /> void timer(int t)<br /> {<br />     glutPostRedisplay();<br />     glutTimerFunc(t,timer,10); //タイマー関数<br />     a+=0xFF;<br /> }</p> <p>void display(void)<br /> {</p> <p> glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glViewport(0,0,WIDTH,HEIGHT);<br />  glMatrixMode(GL_PROJECTION);<br />  glLoadIdentity();<br />  gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 200.0);<br />  glMatrixMode(GL_MODELVIEW);<br />  glLoadIdentity();<br />  gluLookAt(-6.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);</p> <p>        static int index = 0;<br />     int nextIndex = 0;<br />     index = (index + 1) % 2;<br />     nextIndex = (index + 1) % 2;</p> <p><br />     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);</p> <p>    //テクスチャとPboをバインド<br />     glBindTexture(GL_TEXTURE_2D, texId);<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[index]);<br />     //Pboからテクスチャへコピー<br />     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, Image.width, Image.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);<br />     <br />     //次のデータを書き込む<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[nextIndex]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, Image.width * Image.height * Image.Channels, 0, GL_STREAM_DRAW_ARB);<br />     unsigned char* color = (unsigned char*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);<br />     if(color){<br />         int *ptr = (int*)color;<br />         for(int y = 0; y &lt; Image.height ; ++y){<br />             for(int x = 0; x &lt; Image.width; ++x){<br />                 *ptr = a;<br />                 ++ptr;<br />             }<br />         }<br />         <br />         glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);<br />     }</p> <p>    glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);<br />     </p> <p>    glBindTexture(GL_TEXTURE_2D, texId);<br />     glBegin(GL_QUADS);<br />     glTexCoord2f(0.0f, 0.0f);   glVertex3f(-1.0f, -1.0f, 0.0f);<br />     glTexCoord2f(1.0f, 0.0f);   glVertex3f( 1.0f, -1.0f, 0.0f);<br />     glTexCoord2f(1.0f, 1.0f);   glVertex3f( 1.0f,  1.0f, 0.0f);<br />     glTexCoord2f(0.0f, 1.0f);   glVertex3f(-1.0f,  1.0f, 0.0f);<br />     glEnd();</p> <p>    glBindTexture(GL_TEXTURE_2D, 0);</p> <p>    glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glewInit();<br />  glClearColor(0.0, 0.0, 0.0, 1.0);<br />  glEnable(GL_DEPTH_TEST);<br />  glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);<br />  glEnable(GL_COLOR_MATERIAL);<br />  glEnable(GL_LIGHT0);<br />  glEnable(GL_LIGHTING);<br />  glEnable(GL_NORMALIZE);<br />  glEnable(GL_TEXTURE_2D);<br />      glPixelStorei(GL_UNPACK_ALIGNMENT, 4);</p> <p>    glGenTextures(1, &amp;texId);<br />     glBindTexture(GL_TEXTURE_2D, texId);<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //拡大・縮小フィルタ<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);//繰り返しなし<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);<br />     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Image.width, Image.height, 0, GL_BGRA, GL_UNSIGNED_BYTE,Image.imageData);<br />     glBindTexture(GL_TEXTURE_2D, 0);</p> <p>    int DataSize = Image.height * Image.width * Image.Channels;</p> <p>    glGenBuffersARB(2, PboId);//PBOを2つ作成<br />     //1つめ<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[0]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DataSize, 0, GL_STREAM_DRAW_ARB);<br />     //2つめ<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[1]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DataSize, 0, GL_STREAM_DRAW_ARB);</p> <p>    glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);</p> <p><br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("PBO");<br />  glutDisplayFunc(display);<br />  glutTimerFunc(10 , timer , 10);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>
<p><strong>PBOです。</strong></p> <p><strong><img alt="" src="http://cdn21.atwikiimg.com/opengl?cmd=upload&amp;act=open&amp;pageid=292&amp;file=pbo.png" style="width:336px;height:279px;" /></strong></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&amp;act=open&amp;pageid=292&amp;file=main.cpp"> main.cpp</a></td> </tr></tbody></table><p>main.cpp</p> <table border="1" cellpadding="1" cellspacing="1" style="width:600px;"><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 &lt;gl/glew.h&gt;<br /> #include &lt;GL/freeglut/freeglut.h&gt;</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 /> #define WIDTH 320<br /> #define HEIGHT 240</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;"> struct ImageData{<br />     int width;<br />     int height;<br />     int Channels;<br />     unsigned char *imageData;<br /> }Image = {512,512,4,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;"> int a=0;<br /> GLuint texId;//テクスチャ用ID<br /> GLuint PboId[2];//PBO用ID</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 timer(int t)<br /> {<br />     glutPostRedisplay();<br />     glutTimerFunc(t,timer,10); //タイマー関数<br />     a+=0xFF;<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 display(void)<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;">  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);<br />  glViewport(0,0,WIDTH,HEIGHT);<br />  glMatrixMode(GL_PROJECTION);<br />  glLoadIdentity();<br />  gluPerspective(30.0, WIDTH/HEIGHT, 0.1, 200.0);<br />  glMatrixMode(GL_MODELVIEW);<br />  glLoadIdentity();<br />  gluLookAt(-6.0, 0.0, 5.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;">         static int index = 0;<br />     int nextIndex = 0;<br />     index = (index + 1) % 2;<br />     nextIndex = (index + 1) % 2;</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 />     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);</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;">     //テクスチャとPboをバインド<br />     glBindTexture(GL_TEXTURE_2D, texId);<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[index]);<br />     //Pboからテクスチャへコピー<br />     glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, Image.width, Image.height, GL_BGRA, GL_UNSIGNED_BYTE, 0);<br />     <br />     //次のデータを書き込む<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[nextIndex]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, Image.width * Image.height * Image.Channels, 0, GL_STREAM_DRAW_ARB);<br />     unsigned char* color = (unsigned char*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB);<br />     if(color){<br />         int *ptr = (int*)color;<br />         for(int y = 0; y &lt; Image.height ; ++y){<br />             for(int x = 0; x &lt; Image.width; ++x){<br />                 *ptr = a;<br />                 ++ptr;<br />             }<br />         }<br />         <br />         glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB);<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;">     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 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;">     glBindTexture(GL_TEXTURE_2D, texId);<br />     glBegin(GL_QUADS);<br />     glTexCoord2f(0.0f, 0.0f);   glVertex3f(-1.0f, -1.0f, 0.0f);<br />     glTexCoord2f(1.0f, 0.0f);   glVertex3f( 1.0f, -1.0f, 0.0f);<br />     glTexCoord2f(1.0f, 1.0f);   glVertex3f( 1.0f,  1.0f, 0.0f);<br />     glTexCoord2f(0.0f, 1.0f);   glVertex3f(-1.0f,  1.0f, 0.0f);<br />     glEnd();</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;">     glBindTexture(GL_TEXTURE_2D, 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;">     glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glewInit();<br />  glClearColor(0.0, 0.0, 0.0, 1.0);<br />  glEnable(GL_DEPTH_TEST);<br />  glColorMaterial(GL_FRONT,GL_AMBIENT_AND_DIFFUSE);<br />  glEnable(GL_COLOR_MATERIAL);<br />  glEnable(GL_LIGHT0);<br />  glEnable(GL_LIGHTING);<br />  glEnable(GL_NORMALIZE);<br />  glEnable(GL_TEXTURE_2D);<br />      glPixelStorei(GL_UNPACK_ALIGNMENT, 4);</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;">     glGenTextures(1, &amp;texId);<br />     glBindTexture(GL_TEXTURE_2D, texId);<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); //拡大・縮小フィルタ<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);//繰り返しなし<br />     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);<br />     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, Image.width, Image.height, 0, GL_BGRA, GL_UNSIGNED_BYTE,Image.imageData);<br />     glBindTexture(GL_TEXTURE_2D, 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;">     int DataSize = Image.height * Image.width * Image.Channels;</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;">     glGenBuffersARB(2, PboId);//PBOを2つ作成<br />     //1つめ<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[0]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DataSize, 0, GL_STREAM_DRAW_ARB);<br />     //2つめ<br />     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, PboId[1]);<br />     glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, DataSize, 0, GL_STREAM_DRAW_ARB);</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;">     glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 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;"> <br /> }<br /> int main(int argc, char *argv[])<br /> {<br />  glutInitWindowPosition(100, 100);<br />  glutInitWindowSize(WIDTH, HEIGHT);<br />  glutInit(&amp;argc, argv);<br />  glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);<br />  glutCreateWindow("PBO");<br />  glutDisplayFunc(display);<br />  glutTimerFunc(10 , timer , 10);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p>

表示オプション

横に並べて表示:
変化行の前後のみ表示: