Еще одна базовая настройка VBO

Я пытаюсь визуализировать куб, используя VBO с GLUT и Glew. Я проверил свои успехи, я поменял свои буферы, я инициализировал VBO после инициализации GLUT, я (насколько я могу судить) использую правильные типы данных. Мой код свободно следует этот урок.

Соответствующий раздел моего кода:

//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), и в результате получился белый экран, даже после очистки экрана до черного.

3

Решение

Отсутствие визуализации вообще является общей проблемой. К сожалению, я не знаю точно, что не так с вашей программой, но вот стратегия отладки, которую я часто нахожу полезной. Попробуйте визуализировать один треугольник в непосредственном режиме, в отличие от использования VBO. Если вы не знакомы с этим термином, немедленный режим означает такие вещи, как glVertex3f,

Если вы можете заставить треугольник появляться в непосредственном режиме, то ваша проблема, скорее всего, связана с VBO. Если вы не можете, то вы можете сосредоточиться на потенциальных проблемах в ваших матрицах или в том, как вы настроили контекст OpenGL.

Кстати, я бы рекомендовал перейти с конвейера с фиксированной функцией (glVertexPointerи т. д.) к шейдерам GLSL. Поначалу это кажется пугающим, но чрезвычайно гибким. И как только вы войдете в него, вы обнаружите, что он на самом деле более интуитивен, чем чрезвычайно привередливый и непрозрачный конвейер фиксированных функций.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]