- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有以下结构来存储我的顶点数据。
struct Rz3DContourNode {
float x; //pos x
float y; //pos y
float z; //pos z
float nx; //normal x
float ny; //normal y
float nz; //normal z
};
我将顶点列表存储在 STL vector 中,如下所示:
std::vector < Rz3DContourNode > nodes;
当我尝试将其用作 OPEGL 中的顶点数组时,in 不会错误地呈现。
glVertexPointer(3, GL_FLOAT, 12, &nodes[0]);
glDrawArrays(GL_POINTS,0,nodes.size());
因此,我尝试使用指针算法(假设这是 OPENGL 处理数据的方式)来确认这些值,如下所示:
float *ptr=(float*) &nodes[0];
for(int i=0;i<nodes.size();i++)
{
Rz3DContourNode confirmNode=nodes[i];
float x=*ptr;
ptr++;
float y=*ptr;
ptr++;
float z=*ptr;
ptr++;
//Confirm values !!! Do not equal ??
qDebug("x=%4.2f y=%4.2f z=%4.2f | nx=%4.2f ny=%4.2f nz=%4.2f
",confirmNode.x,confirmNode.y,confirmNode.z,x,y,z);
//Skip normal positions
ptr++;
ptr++;
ptr++;
}
如果我直接从结构中访问值,则值不相等。
这是否意味着结构不会连续保存值?
[编辑] 我刚刚注意到使用 sizeof() 而不是 12 解决了如下问题:
glVertexPointer(3, GL_FLOAT, sizeof(Rz3DContourNode), &nodes[0]);
但我仍然很困惑为什么我的 hack 没有在内存中正确遍历?(为什么 qDebug 不打印相同的值?)
最佳答案
sizeof(Rz3DContourNode) == 6*4 = 24 bytes ... not 12!
步长是每个顶点开始之间的字节数,而不是填充。虽然 0 是一个特殊值,表示数据紧密打包。
因此,如果您使用 3 个 float 作为顶点数据,则步幅为 0 和 12 之间没有区别(因为 3 个 float 是 12 个字节)。在你的例子中,你的结构是 24 字节,所以你应该把它放好。
这个约定(步幅 = 步长,而不是填充)允许简单地使用 sizeof,所以你最终凭直觉做了正确的事情。这对你来说是很好的 API 设计。 :)
参见 glVertexPointer docs :
stride
Specifies the byte offset between consecutive vertices. If stride is 0, the vertices are understood to be tightly packed in the array. The initial value is 0.
关于C++ 结构内存布局和 OpenGL glVertexPointer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7304502/
我正在查看 CUDA 的粒子示例,但我找不到它们在顶点数组和着色器中的变量之间建立链接的位置。根据我读过的内容和实际上我一直在做的方式是 ... glGenBuffers(1, &VBO); glBi
调用glVertexPointer()(以及其他相关函数)时使用堆栈上的顶点数组是否安全?我不清楚 OpenGL 何时实际从传入的结构中复制数据。 如果不安全,那么您如何知道何时可以安全地销毁/重用传
我在使用 OpenGL 时遇到了一个相当奇怪的问题。当我尝试使用没有绑定(bind)到 GL_ARRAY_BUFFER 的缓冲区的 glVertexPointer 并使用 Vertex Array O
我正在为 iOS 使用 OPENGL ES,但是这可能适用于任何 OPENGL 场景;我有一个顶点数组,但只想绘制其中的一些。在下面的示例中,我想从第一个点到第二个点画一条线,然后是第 4 个点到第
我正在使用 OpenGL ES 创建一个 Android 应用程序,需要一些关于顶点、纹理和法线指针的帮助。我看到的例子停留在相当基本的水平,所以我似乎错过了一些信息。 我的基本 draw() 过程是
我的顶点交错在 numpy 数组 (dtype = float32) 中,如下所示:... tu, tv, nx, ny, nz, vx, vy, vz, ... 渲染时,我像这样调用 gl*Poin
每当我查看解释如何使用 glDrawArrays 和 glVertexPointer 命令的教程时,它们使用的参数都与我可用的参数不同。 例如:教程使用如下参数调用 glVertexPointer:(
我有以下结构来存储我的顶点数据。 struct Rz3DContourNode { float x; //pos x float y; //pos y float z; //pos
我有一个 Nx4 顶点数组,我想使用 glVertexArray 和 glDrawArray 绘制它们。作为二维散点图。我目前像这样初始化数组: GLint data[4][MAX_N_POINT];
我正在绘制一个交错缓冲区——它是一个通用的顶点属性缓冲区。布局由三个 float 作为顶点坐标,以及另外两个 float 属性组成,交错如下: | float | float | floa
我需要将我的程序从 glVertex 重新编写为 glDrawArrays,并且我正在尝试使用此函数进行整理。您能解释一下为什么这段代码不起作用以及如何更改它,以便它绘制 2 个三角形吗? impor
我在 Android 上使用 OpenGL ES 绘制一些形状,所以我有一些模型类可以从 .obj 文件加载顶点等。 然后每个模型都有一个 onDrawFrame() 方法,由渲染器调用以将其放置在场
首次使用程序渲染顶点缓冲区时遇到问题,然后在没有程序的情况下渲染不同的顶点缓冲区。 对于第一个缓冲区,当启用程序时,我使用类似于以下的代码: glBindBuffer( GL_ARRAY_BUFFER
在终端中使用 ndk-build 编译以下 C 代码时(我正在运行 Ubuntu): #include #include #include #include "org_opengldrawinj
我的渲染器过去使用 glBegin/glEnd 用旧的固定函数渲染几何体。通过 glVertexPointer 等将其切换为使用顶点数组后。等,我的 Cg 着色器停止显示。如果我只是做一个常规的纹理绑
我有一个表示顶点的类,如下所示: class Vertex { public: Vertex(void); ~Vertex(void); GLfloat x; GLfloat y; GLfloat z
我创建了一个类来从高度图文件加载地形点;但绘制它们会导致崩溃。我已将错误缩小到返回 1281 的 glVertexPointer() 函数(我被引导相信是无效值)。我已经完成了 65k 左右的点数,但
我在使用 OpenGL 2.0 管道 的家庭作业中遇到问题。问题是当我尝试设置 glVertexPointer 时出现 GL_INVALID_OPERATION(错误 1282)。 我在网上找不到太多
您好,我在使用 VBO 绘图时遇到问题。所以我问了一个问题here .我找不到问题的答案。但是通过讨论那里给出的一个答案,我现在有了另一个关于 VBO 进步的问题。我对它是什么和做什么感到困惑。 在h
我使用结构 struct Vertex { float pos[3]; float tex[2] = {0, 0}; float norm[3] = {0, 0, 0}; int i
我是一名优秀的程序员,十分优秀!