VBO(テクスチャ付)

「VBO(テクスチャ付)」の編集履歴(バックアップ)一覧はこちら

VBO(テクスチャ付)」(2015/05/01 (金) 15:08:52) の最新版変更点

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

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

<p>テクスチャも含めてVBOで描画します。</p> <p> </p>
<p><strong>テクスチャも含めてVBOで描画します。</strong></p> <p><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=vbot.png" /></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=323&amp;file=main.cpp"> main.cpp</a></td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=lodepng.cpp"> lodepng.cpp</a></td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=lodepng.h"> lodepng.h</a></td> </tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=PNG.h"> PNG.h</a></td> </tr><tr><td> <p><a href="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=sample.png"> sample.png</a></p> <p><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&amp;act=open&amp;pageid=323&amp;file=sample.png" /></p> </td> </tr></tbody></table><p>main.cpp</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;<br /> #include "PNG.h"</p> <p>#define WIDTH 320<br /> #define HEIGHT 240</p> <p>GLuint VboId[4];//4つ分<br /> float angle=0.0f;<br /> GLuint texID;<br /> TEXTURE *texture;</p> <p>//頂点データ 3面を4頂点で作成する 1頂点はx,y,zの3要素<br /> GLfloat Vertex[3][4][3] ={<br />  {{1.0f,0.0f,0.0f},{1.0f,0.0f,1.0f},{0.0f,1.0f,1.0f},{0.0f,1.0f,0.0f}},//1枚目<br />  {{1.0f,0.0f,0.0f},{1.0f,0.0f,1.0f},{-1.0f,0.0f,1.0f},{-1.0f,0.0f,0.0f}},//2枚目<br />  {{-1.0f,0.0f,0.0f},{-1.0f,0.0f,1.0f},{0.0f,1.0f,1.0f},{0.0f,1.0f,0.0f}},//3枚目<br /> };<br /> GLfloat Normal[3][4][3] ={<br />  {{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f},{1.0f,0.5f,0.0f}},//右上<br />  {{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f},{0.0f,-1.0f,0.0f}},//下<br />  {{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f},{-1.0f,0.5f,0.0f}},//左上<br /> };<br /> GLfloat Color[3][4][3] ={<br />  {{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f},{1.0f,0.0f,0.0f}},//赤<br />  {{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f},{0.0f,0.0f,1.0f}},//青<br />  {{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f},{0.0f,1.0f,0.0f}},//緑<br /> };<br /> GLfloat UV[3][4][2] ={<br />  {{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},<br />  {{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},<br />  {{0.0f,0.0f},{0.0f,1.0f},{1.0f,1.0f},{1.0f,0.0f}},<br /> };<br /> void DrawArray(void)<br /> {<br />   //データの場所を知らせる<br />  //座標<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);<br />  glVertexPointer(3, GL_FLOAT, 0, 0);<br />  //法線<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);<br />  glNormalPointer(GL_FLOAT, 0, 0);<br />  //色<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);<br />  glColorPointer(3,GL_FLOAT, 0, 0);<br />  //UV<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[3]);<br />  glTexCoordPointer(2,GL_FLOAT, 0, 0);</p> <p> //有効化<br />  glEnableClientState(GL_VERTEX_ARRAY);<br />  glEnableClientState(GL_NORMAL_ARRAY);<br />  glEnableClientState(GL_COLOR_ARRAY);<br />  glEnable(GL_TEXTURE_2D);<br />  glEnableClientState(GL_TEXTURE_COORD_ARRAY);</p> <p> glDrawArrays(GL_QUADS,0,4*3); //描画(4頂点*3面)</p> <p> //無効化<br />  glDisableClientState(GL_TEXTURE_COORD_ARRAY);<br />  glDisable(GL_TEXTURE_2D);<br />  glDisableClientState(GL_COLOR_ARRAY);<br />  glDisableClientState(GL_NORMAL_ARRAY);<br />  glDisableClientState(GL_VERTEX_ARRAY);<br /> }<br /> void display(void)<br /> {<br />  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(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);</p> <p> glRotatef(angle,1.0f,0.0f,0.0f);//回転<br />  glRotatef(angle,0.0f,1.0f,0.0f);//回転</p> <p> DrawArray();</p> <p> glutSwapBuffers();<br /> }<br /> void idle(void)<br /> {<br />  angle+=0.2f;<br />  Sleep(1);<br />  glutPostRedisplay();<br /> }<br /> void Init(){<br />  glewInit();<br />  glClearColor(1.0, 1.0, 1.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);//法線の正規化</p> <p>  glGenBuffers(4,&amp;VboId[0]);//座標、法線、色,UVの4つ<br />  <br />  //頂点<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[0]);<br />  glBufferData(GL_ARRAY_BUFFER,sizeof(Vertex),<br />     Vertex,GL_DYNAMIC_DRAW);</p> <p> //法線<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[1]);<br />  glBufferData(GL_ARRAY_BUFFER,sizeof(Normal),<br />     Normal,GL_DYNAMIC_DRAW);</p> <p> //色<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[2]);<br />  glBufferData(GL_ARRAY_BUFFER,sizeof(Color),<br />      Color,GL_STREAM_DRAW);<br />  //UV<br />  glBindBuffer(GL_ARRAY_BUFFER,VboId[3]);<br />  glBufferData(GL_ARRAY_BUFFER,sizeof(UV),<br />   UV, GL_DYNAMIC_DRAW);<br />  //テクスチャを作成<br />  texture = new TEXTURE("sample.png");<br />  glGenTextures(1, (GLuint *)&amp;texID);<br />  glBindTexture(GL_TEXTURE_2D, texID);<br />  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);<br />  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);<br />  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);<br />  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);</p> <p> glEnable(GL_TEXTURE_2D);<br />  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,texture-&gt;Width, texture-&gt;Height,<br />     0,GL_RGBA, GL_UNSIGNED_BYTE, texture-&gt;image);<br />  glDisable(GL_TEXTURE_2D);</p> <p>}<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("VBO");<br />  glutDisplayFunc(display);<br />  glutIdleFunc(idle);<br />  Init();<br />  glutMainLoop();<br />  return 0;<br /> }</p> </td> </tr></tbody></table><p> </p> <p> </p> <p> </p> <p> </p> <p> </p> <p> </p>

表示オプション

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