Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 布局内存供OpenGL使用的问题(需要glBufferSubData帮助)_C++_Opengl_Memory - Fatal编程技术网

C++ 布局内存供OpenGL使用的问题(需要glBufferSubData帮助)

C++ 布局内存供OpenGL使用的问题(需要glBufferSubData帮助),c++,opengl,memory,C++,Opengl,Memory,所以今天我想学习如何使用Vector2&Color类以非常简洁的语法将数据发送到OpenGL 计划是这样的 /* 矢量2(8字节) 颜色(16字节) 矢量2+颜色=24字节 记忆怎么能这样排列呢? {Vector2,Color}, {Vector2,Color}, {Vector2,Color} */ 我有两个数据数组 Vector2 vertices[] = { Vector2(0.0f, 0.5f), Vector2(0.5f, -0.5f), Vector2(-0

所以今天我想学习如何使用Vector2&Color类以非常简洁的语法将数据发送到OpenGL

计划是这样的

/*
矢量2(8字节)
颜色(16字节)
矢量2+颜色=24字节
记忆怎么能这样排列呢?
{Vector2,Color},
{Vector2,Color},
{Vector2,Color}
*/
我有两个数据数组

Vector2 vertices[] = {
    Vector2(0.0f, 0.5f),
    Vector2(0.5f, -0.5f),
    Vector2(-0.5f, -0.5f)
};

// colors would be mapped to there respective indexes in the vertices array (i.e colors[0] is mapped to vertices[0])
Color colors[] = {
    Color(1.0f, 0.3f, 0.3f),
    Color(0.3f, 1.0f, 0.3f),
    Color(0.3f, 0.3f, 1.0f)
};
我能够在正确的点上绘制正三角形,

但是发送颜色数据对我来说非常困难

我目前得到的结果是这样的。

下面是一段代码


//屏幕上的位置
矢量2顶点[]={
矢量2(0.0f,0.5f),
矢量2(0.5f,-0.5f),
向量2(-0.5f,-0.5f)
};
//每个位置的颜色
颜色[]={
颜色(1.0f,0.3f,0.3f),
颜色(0.3f、1.0f、0.3f),
颜色(0.3f、0.3f、1.0f)
};
//创建顶点和数组缓冲区(每个缓冲区自动绑定)
无符号整数vertexArray=createVertexArray();
unsigned int vertexBuffer=createBuffer(GL\u ARRAY\u BUFFER);
//分配数据
glBufferData(GL_数组_缓冲区、sizeof(顶点)+sizeof(颜色)、nullptr、GL_静态_绘制);
//填满分配的内存
对于(int i=0;i<3;++i){
glBufferSubData(GL_ARRAY_BUFFER,sizeof(Vector2)*i,sizeof(Vector2),&顶点[i]);
glBufferSubData(GL_数组_BUFFER,(sizeof(Vector2)+sizeof(Color))*(i+1)、sizeof(Color)和colors[i]);
}
//设置顶点属性
glvertexattributepointer(0,2,GL_FLOAT,false,sizeof(Vector2)+sizeof(Color),nullptr);
glvertexattributepointer(1,3,GL_FLOAT,false,sizeof(Vector2)+sizeof(Color),(const void*)(sizeof(Vector2));
GlenableVertexAttributeArray(0);
GlenableVertexAttributeArray(1);

您需要在缓冲区中交替添加1个顶点和1种颜色:

for(int i=0;i<3;++i)
{    
GLintptr offsetV=i*(向量2的大小)+颜色的大小);
glBufferSubData(GL_ARRAY_BUFFER、offsetV、sizeof(Vector2)和顶点[i]);
GLintptr offsetC=offsetV+sizeof(矢量2);
glBufferSubData(GL_数组_BUFFER、offsetC、sizeof(Color)和colors[i]);
} 

您需要在缓冲区中交替添加1个顶点和1种颜色:

for(int i=0;i<3;++i)
{    
GLintptr offsetV=i*(向量2的大小)+颜色的大小);
glBufferSubData(GL_ARRAY_BUFFER、offsetV、sizeof(Vector2)和顶点[i]);
GLintptr offsetC=offsetV+sizeof(矢量2);
glBufferSubData(GL_数组_BUFFER、offsetC、sizeof(Color)和colors[i]);
}