2017-11-23 17 views
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); 
} 

答えて

0

あなたがシェーダを使用していないと、あなたも、(gluOrtho2D)あなたが頂点を設定する必要がありますが、Fixed Function Pipeline属性Fixed Function Pipeline行列を設定しているので。

あなたの頂点属性の設定と、次のように何とかなりますdrawTexturedGroundVBO機能:

void drawTexturedGroundVBO(void) { 

    // Bind texture 
    glEnable(GL_TEXTURE_2D); 
    glEnable(GL_BLEND); 
    glBindTexture(GL_TEXTURE_2D, myGroundTexture); 

    glBindBuffer(GL_ARRAY_BUFFER, quadPosVBO); 
    glVertexPointer(2, GL_FLOAT, 0, NULL); 
    glEnableClientState(GL_VERTEX_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, quadColourVBO); 
    glColorPointer(4, GL_FLOAT, 0, NULL); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBuffer(GL_ARRAY_BUFFER, quadTexCoordVBO); 
    glTexCoordPointer(2, GL_FLOAT, 0, NULL); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

    // 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); 
} 


をさらに参照: