「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&act=open&pageid=292&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 <gl/glew.h><br />
#include <GL/freeglut/freeglut.h></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 < Image.height ; ++y){<br />
for(int x = 0; x < 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, &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(&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&act=open&pageid=292&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&act=open&pageid=292&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 <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;">
<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 < Image.height ; ++y){<br />
for(int x = 0; x < 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, &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(&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>