「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&act=open&pageid=323&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&act=open&pageid=323&file=main.cpp">
main.cpp</a></td>
</tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=323&file=lodepng.cpp">
lodepng.cpp</a></td>
</tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=323&file=lodepng.h">
lodepng.h</a></td>
</tr><tr><td><a href="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=323&file=PNG.h">
PNG.h</a></td>
</tr><tr><td>
<p><a href="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=323&file=sample.png">
sample.png</a></p>
<p><img alt="" src="http://www21.atwiki.jp/opengl?cmd=upload&act=open&pageid=323&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 <gl/glew.h><br />
#include <GL/freeglut/freeglut.h><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,&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 *)&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->Width,
texture->Height,<br />
0,GL_RGBA, GL_UNSIGNED_BYTE, texture->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(&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>