3

GLUT と Glew を使用して VBO を使用してキューブをレンダリングしようとしています。私はストライドをチェックしました。バッファを交換しています。GLUT が初期化された後に VBO を初期化しています。(私が知る限り)正しいデータ型を使用しています。私のコードは、大まかにこのチュートリアルに従います。

私のコードの関連セクション:

//main.cpp
#include <iostream>
#include "include.h"
#include "terrain.h"
#include <math.h>

#define NULL 0

float angle = 0.0f;
float lx = 0.0f, lz = -1.0f;
float x = 0.0f, z = 5.0f;


GLuint vboID;
GLuint indexVBOID;

void render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glLoadIdentity();
    gluLookAt(x, 1.0f, z, x + lx, 1.0f, z+lz, 0.0f, 1.0f, 0.0f);

    glPushMatrix();

    glBindBuffer(GL_ARRAY_BUFFER, vboID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_COLOR_ARRAY);
    glEnableClientState(GL_NORMAL_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);


    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3*sizeof(GLfloat)));
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(5*sizeof(GLfloat)));
    glColorPointer(4, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(8*sizeof(GLfloat)));
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

    glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    glPopMatrix();      

    glutSwapBuffers();

    //std::cout << glGetError();
}

void resize(int w, int h) {
    if(h == 0)
        h = 1;

    float ratio = 1.0*w/h;
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glViewport(0, 0, w, h);
    gluPerspective(45, ratio, 1, 1000);
    glMatrixMode(GL_MODELVIEW);
}

void processKeys(unsigned char key, int x, int y) {

}

void specialKeys(int key, int x, int y) {
        float fraction = 0.1f;

    switch(key) {
    case GLUT_KEY_LEFT:
        angle -= 0.01f;
        lx = sin(angle);
        lz = -cos(angle);
        break;

    case GLUT_KEY_RIGHT:
        angle += 0.01f;
        lx = sin(angle);
        lz = -cos(angle);
        break;

    case GLUT_KEY_UP:
        x += lx * fraction;
        z += lz * fraction;
        break;

    case GLUT_KEY_DOWN:
        x -= lx * fraction;
        z -= lz * fraction;
        break;
    }
}

void initVBO() {
    glGenBuffers(1, &vboID);
    glBindBuffer(GL_ARRAY_BUFFER, vboID);

    glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*24, NULL, GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Vertex)*24, &cube[0]);

    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(3*sizeof(GLfloat)));
    glNormalPointer(GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(5*sizeof(GLfloat)));
    glColorPointer(4, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(8*sizeof(GLfloat)));
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), BUFFER_OFFSET(0));

    glGenBuffers(1, &indexVBOID);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBOID);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, 36*sizeof(GLubyte), &cubeIndex[0], GL_STATIC_DRAW);
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(1000, 600);
    glutCreateWindow("FC");

    //glew initialization
    glewInit();
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glEnable(GL_DEPTH_TEST);
    glShadeModel(GL_FLAT);


    initializeCube();
    initVBO();

    glutDisplayFunc(render);
    glutReshapeFunc(resize);
    glutIdleFunc(render);

    glutKeyboardFunc(processKeys);
    glutSpecialFunc(specialKeys);

    glDisable(GL_TEXTURE_2D);


    glutMainLoop();

    return 1;
}

Terrain.cpp はキューブのデータを初期化するだけです。

//terrain.h
#ifndef _TERRAIN_
#define _TERRAIN_

#include "include.h"

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

// Location/Normals
#define X_POS 0
#define Y_POS 1
#define Z_POS 2
// Texture Coordinates
#define U_POS 0
#define V_POS 1
// colors
#define R_POS 0
#define G_POS 1
#define B_POS 2
#define A_POS 3

const GLfloat cubeSize = 1.0f;

typedef struct Vertex {
    GLfloat location[3];
    GLfloat tex[2];
    GLfloat normal[3];
    GLfloat color[4];
    GLubyte padding[16];
} Vertex;

static Vertex cube[24];
static GLubyte cubeIndex[36];

void pushVertex(Vertex* toPush, GLfloat x, GLfloat y, GLfloat z);

void pushNormal(Vertex* toPush, GLfloat x, GLfloat y, GLfloat z);

void pushTexCoord(Vertex* toPush, GLfloat u, GLfloat v);

void pushTriangleIndices(GLubyte index[], int triangleNum, GLubyte a, GLubyte b, GLubyte c);

void initializeCube();

#endif

そして最後に:

#ifndef __INCLUDE__
#define __INCLUDE__

#include <GL/glew.h>
#include <GL/glut.h>

#endif

Terrain.cpp を見たい人がいれば投稿します。

私が知る限り、何もレンダリングされていません。即時モードでレンダリングしようとすると、問題なく動作します。そして、それが助けになる場合は、チュートリアルのコードをそのままコピーしてみました(作者が最初にGlewなしで書いたので、Glewの数行を追加しました)。画面を黒くクリアした後でも、結果は白い画面でした。

4

1 に答える 1

2

何もレンダリングしないことはよくある問題です。残念ながら、あなたのプログラムの何が問題なのか正確にはわかりませんが、私がよく役立つデバッグ戦略を次に示します。VBO を使用するのではなく、即時モードで単一の三角形をレンダリングしてみてください。この用語に慣れていない方のために説明すると、即時モードは のようなものを意味しますglVertex3f

三角形を即時モードで表示できる場合、問題は VBO にある可能性が最も高いです。それができない場合は、マトリックスまたは OpenGL コンテキストを構成した方法で潜在的な問題に焦点を当てることができます。

ちなみに固定機能パイプライン(glVertexPointerなど)からGLSLシェーダーに切り替えることをお勧めします。最初は難しそうに見えますが、非常に柔軟です。そして、実際に入ってみると、非常に扱いにくく不透明な固定関数パイプラインよりも、実際にはより直感的であることがわかります。

于 2012-11-15T23:56:45.810 に答える