0
VBOを使用して背景を作成しようとしていますが、緑の背景画像しか取得できないため、テクスチャが機能しません。私はOpenGLを全く新しくしており、現在のところ既製のコードで作業しています。また、別のオブジェクト(同じ方法)を追加して透明にしてみてくださいOpenGLテクスチャVBO
#include "stdafx.h"
#include <glew\glew.h>
#include <freeglut\freeglut.h>
#include <CoreStructures\CoreStructures.h>
#include "texture_loader.h"
using namespace std;
using namespace CoreStructures;
// Textures
GLuint myGroundTexture = 0;
// Vertex Buffer Object IDs for the ground texture object
GLuint quadPosVBO, quadColourVBO, quadTexCoordVBO, quadIndicesVBO;
// Packed vertex arrays for the background
// 1) Position Array - Store vertices as (x,y) pairs
static GLfloat quadVertices[] = {
-1.0, -1.0f,
-1.0f, 1.0f,
1.0f, -1.0f,
1.0f, 1.0f
};
// 2) Colour Array - Store RGB values as unsigned bytes
static GLubyte quadColors[] = {
255, 0, 0, 255,
255, 255, 0, 255,
0, 255, 0, 255,
0, 255, 255, 255
};
// 3) Texture coordinate array (store uv coordinates as floating point values)
static float quadTextureCoords[] = {
0.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f,
1.0f, 0.0f
};
// 4) Index Array - Store indices to quad vertices - this determines the order the vertices are to be processed
static GLubyte quadVertexIndices[] = { 0, 1, 2, 3 };
// Function Prototypes
void init(int argc, char* argv[]);
void setupGroundTextureVBO(void);
void display(void);
void drawTexturedGroundVBO(void);
int _tmain(int argc, char* argv[]) {
init(argc, argv);
glutMainLoop();
shutdownCOM();
return 0;
}
void init(int argc, char* argv[]) {
// Initialise COM so we can use Windows Imaging Component
initCOM();
// Initialise FreeGLUT
glutInit(&argc, argv);
// Setup OpenGL window properties
glutInitContextVersion(4, 3);
glutInitContextProfile(GLUT_COMPATIBILITY_PROFILE);
glutInitDisplayMode(GLUT_RGBA | GLUT_DEPTH | GLUT_DOUBLE);
// Create window
glutInitWindowSize(1200, 800);
glutInitWindowPosition(64, 64);
glutCreateWindow("Funky Fish");
// Register display callback function
glutDisplayFunc(display);
// Initialise GLEW library
GLenum err = glewInit();
// Ensure GLEW was initialised successfully before proceeding
if (err == GLEW_OK) {
cout << "GLEW initialised okay\n";
} else {
cout << "GLEW could not be initialised\n";
throw;
}
// Initialise OpenGL state
// Setup colour to clear the window
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glLineWidth(9.0f);
// Set viewplane size
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0f, 1.0f, -1.0f, 1.0f);
glMatrixMode(GL_MODELVIEW);
//Load textures
myGroundTexture = fiLoadTexture("underwater.jpg");
//Setup the objects using VBO
setupGroundTextureVBO();
}
void setupGroundTextureVBO(void) {
// setup VBO for the quad object position data
glGenBuffers(1, &quadPosVBO);
glBindBuffer(GL_ARRAY_BUFFER, quadPosVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadVertices), quadVertices, GL_STATIC_DRAW);
// setup VBO for the quad object colour data
glGenBuffers(1, &quadColourVBO);
glBindBuffer(GL_ARRAY_BUFFER, quadColourVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadColors), quadColors, GL_STATIC_DRAW);
// setup VBO for the quad object texture coord data
glGenBuffers(1, &quadTexCoordVBO);
glBindBuffer(GL_ARRAY_BUFFER, quadTexCoordVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(quadTextureCoords), quadTextureCoords, GL_STATIC_DRAW);
// setup quad vertex index array
glGenBuffers(1, &quadIndicesVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadIndicesVBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(quadVertexIndices), quadVertexIndices, GL_STATIC_DRAW);
}
// Example rendering functions
void display(void) {
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
drawTexturedGroundVBO();
glutSwapBuffers();
}
// draw our ground function
void drawTexturedGroundVBO(void) {
// Bind each vertex buffer and enable
// Bind texture
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBindTexture(GL_TEXTURE_2D, myGroundTexture);
glBindBuffer(GL_ARRAY_BUFFER, quadPosVBO);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, quadColourVBO);
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, (const GLvoid*)0);
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, quadTexCoordVBO);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, (const GLvoid*)0);
glEnableVertexAttribArray(2);
// Bind the index buffer
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadIndicesVBO);
// Draw the object
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_BYTE, (GLvoid*)0);
glDisable(GL_TEXTURE_2D);
}