另一个基本的 VBO 设置
Another Basic VBO Setup
我正在尝试使用带有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;
}
地形.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
如果有人想看地形.cpp,我会发布它。
据我所知,根本没有渲染任何东西。如果我尝试以即时模式渲染,它工作正常。而且,如果有任何帮助,我尝试逐字复制教程的代码(为 Glew 添加几行,因为作者最初在没有 Glew 的情况下编写它),结果是白屏,即使在将屏幕清除为黑色之后也是如此。
根本没有渲染是一个常见问题。不幸的是,我不知道你的程序到底出了什么问题,但这里有一个我经常发现有用的调试策略。尝试在即时模式下渲染单个三角形,而不是使用 VBO。如果您不熟悉该术语,即时模式意味着类似 glVertex3f
.
如果可以使三角形以即时模式显示,那么您的问题很可能与 VBO 有关。如果不能,则可以将矩阵中的潜在问题或配置OpenGL上下文的方式归零。
顺便说一下,我建议从固定函数管道(glVertexPointer
等)切换到 GLSL 着色器。乍一看似乎令人生畏,但它非常灵活。一旦你进入它,你会发现它实际上比极其挑剔和不透明的固定函数管道更直观。
相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- 在C++/Linux中设置单调时钟的一些技巧
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 嵌套在类中时无法设置成员数据
- 需要帮助设置在C++中使用的Potrace
- 如何在自删除后将对象设置为nullptr
- 将指针设置为"nullptr"并不能防止双重删除?
- 如何在Ubuntu中使用cmake设置qt4
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 如何在boost beast http请求中设置http头
- 如何解决gcc编译器优化导致的centos双编译器设置中的分段错误
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 为什么文件名被设置为一个点,而不是在读取矢量中的文件名时
- 如何在24位SDL_Surface上设置像素的颜色
- std::设置自定义比较器
- 如何设置一个范围来提取我想要获得的信息
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- 通过选项卡的文本设置QTabWidget顺序
- 将特征矩阵的向量设置为0
- 另一个基本的 VBO 设置