Vector::data()在opengl颜色顶点混合数组中的使用问题

在使用OpenGL绘制矩形时,通过glColorPointer和glVertexPointer设置颜色和顶点。遇到的问题是,使用Vector::data()获取的指针偏移计算错误,导致颜色显示不正确。原本需要的颜色偏移值为sizeof(float) * 3,但由于Vector::data()返回的是VColor类型的指针,直接进行偏移导致字节数错误。解决方案是将指针转换为char*类型后再进行偏移,使得颜色能够正常显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用glcolorpointer() 和glvetexpointer()绘制矩形的代码如下

显示列表生成:

这里我遇到的一个问题就是glcolorpointer传递指针的偏移,我需要的颜色偏移值为sizeof(float)*3  就是结构题里面的float x,y,z 三个元素 ,所以颜色偏移值为12字节

但是我一直得不到正确的颜色显示

原因在于vector::data()返回的是传入模版的指针 在这里返回的是我自己定义的VColor* 我对VColor*类型的指针进行了+12  这里偏移的字节量 为sizeof(VColor)*12 = 4*7*12=332字节,

自然是得不到正确的的结果

在对指针类型转化成char*之后 字节正常偏移,颜色显示正常

位置移动和绘制

要在OpenGL中以三维方式展示二维颜色数组,首先需要将二维数组转换成适合OpenGL的数据结构,如顶点数组对象(VAO)和顶点缓冲对象(VBO)。这里是一个概述的过程: 1. **准备数据**[^1]: - 定义一个结构体来表示像素,包含红绿蓝(RGB)颜色分量,例如`struct Pixel { float r, g, b; }`。 - 将二维颜色数组复制到这些结构体的实例中,形成一个一维顶点数组。 ```cpp std::vector<Pixel> vertexData; for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { Pixel pixel = { static_cast<float>(colors[y][x].r), // 色彩通道值 static_cast<float>(colors[y][x].g), static_cast<float>(colors[y][x].b) }; vertexData.push_back(pixel); } } ``` 2. **创建顶点缓冲对象**: - 创建一个VBO并绑定,将顶点数据传入。 ```cpp GLuint vbo; glGenBuffers(1, &vbo); glBindBuffer(GL_ARRAY_BUFFER, vbo); glBufferData(GL_ARRAY_BUFFER, sizeof(Pixel) * vertexData.size(), &vertexData[0], GL_STATIC_DRAW); ``` 3. **设置顶点属性**: - 设置顶点属性布局,告诉OpenGL每个元素的位置。 ```cpp glVertexAttribPointer(vertexAttribPosition, 3, GL_FLOAT, GL_FALSE, sizeof(Pixel), 0); glEnableVertexAttribArray(vertexAttribPosition); ``` 4. **定义顶点数组对象**: - 创建VAO,并将VBO关联到其中。 ```cpp GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); glBindBuffer(GL_ARRAY_BUFFER, vbo); ``` 5. **渲染三角形**: - 使用一个循环遍历像素,每四个像素作为一个小矩形的顶点(假设像素大小为1),然后调用glDrawArrays或glDrawElements绘制。 ```cpp for (int i = 0; i < vertexData.size(); i += 4) { glDrawArrays(GL_TRIANGLE_STRIP, i, 4); } ``` 6. **清理**: - 当不再需要时,记得删除VBO和VAO。 ```cpp glDeleteVertexArrays(1, &vao); glDeleteBuffers(1, &vbo); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值