OpenGL VBOs:绘制一个球体
OpenGL VBOs: Drawing a sphere
我在画球体时遇到了一些麻烦。
std::vector<GLfloat> ballVerts;
for(int i = 0; i <= 40; i++)
{
double lat0 = M_PI * (-0.5 + (double) (i - 1) / 40);
double z0 = sin(lat0);
double zr0 = cos(lat0);
double lat1 = M_PI * (-0.5 + (double) i / 40);
double z1 = sin(lat1);
double zr1 = cos(lat1);
for(int j = 0; j <= 40; j++)
{
double lng = 2 * M_PI * (double) (j - 1) / 40;
double x = cos(lng);
double y = sin(lng);
ballVerts.push_back(x * zr0); //X
ballVerts.push_back(y * zr0); //Y
ballVerts.push_back(z0); //Z
ballVerts.push_back(0.0f);
ballVerts.push_back(1.0f);
ballVerts.push_back(0.0f);
ballVerts.push_back(1.0f); //R,G,B,A
ballVerts.push_back(x * zr1); //X
ballVerts.push_back(y * zr1); //Y
ballVerts.push_back(z1); //Z
ballVerts.push_back(0.0f);
ballVerts.push_back(1.0f);
ballVerts.push_back(0.0f);
ballVerts.push_back(1.0f); //R,G,B,A
}
}
glGenBuffers(1, &ballVbo);
glBindBuffer(GL_VERTEX_ARRAY, ballVbo);
GLuint sphereSize = 3200*7*4; //3200 vertixes * 7 floats
glBufferData(GL_VERTEX_ARRAY,sphereSize, &ballVerts, GL_STATIC_DRAW);
/*
Draw a ball
*/
glBindBuffer(GL_VERTEX_ARRAY, ballVbo);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 7*4, 0);
glEnableClientState(GL_COLOR_ARRAY);
glColorPointer(4, GL_FLOAT, 7*4, (void*)(3*4));
glDrawArrays(GL_TRIANGLE_STRIP, 0, 3200);
glBindBuffer(GL_ARRAY_BUFFER, 0);
生成球体的代码在即时模式下工作正常,但是当我将其放入 VBO 时,我不断收到来自 glDrawArray 的访问冲突异常。有什么建议吗?
glBufferData(GL_VERTEX_ARRAY,sphereSize, &ballVerts, GL_STATIC_DRAW);
ballVerts
不是一个数组。这是一个std::vector
.获取std::vector
的地址不会获取vector
中包含的数组的地址。您需要使用&ballVerts[0]
;
更好的预调整大小矢量并使用迭代器扫描它像这样:
std::vector <GLfloat> vertices;
vertices.resize(count * 3);
...
std::vector <GLfloat>::iterator v = vertices.begin();
for( U32 r = 0; r < m_prec/2; ++r ) //широта
{
float const theta1 = -F_PI_BY_TWO + pi2p * r;
float const theta2 = theta1 + pi2p;
for( U32 s = 0; s < m_prec; ++s ) //долгота
{
float const theta3 = s * pi2p;
float ex = cosf(theta3) *cosf(theta2);
float ey = sinf(theta2);
float ez = sinf(theta3) * cosf(theta2);
*v++ = m_x + m_radius * ex;
*v++ = m_y + m_radius * ey;
*v++ = m_z + m_radius * ez;
等。
::glVertexPointer(3, GL_FLOAT, 0 , &vertices[0]);
会工作
相关文章:
- 如何创建一个CMake变量,除非显式重写,否则使用默认值
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 运行同一解决方案的另一个项目的项目
- 挂起和取消挂起一个文件DLL
- 用C++中的一个变量定义一个常量
- 函数向量_指针有不同的原型,我可以构建一个吗
- 在c++中用vector填充一个简单的动态数组
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 预处理器:插入结构名称中的前一个行号
- 我在c++代码中生成了一个运行时#3异常
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 从链接列表c++中删除一个项目
- 告诉一个 const char 数组,除了编译时 C 样式的字符串外,它不以 '