Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.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
Ios GLES2.0上的VBO GLDraweElements和GLVertexAttribute指针不显示任何内容_Ios_Opengl Es_Opengl Es 2.0_Vbo - Fatal编程技术网

Ios GLES2.0上的VBO GLDraweElements和GLVertexAttribute指针不显示任何内容

Ios GLES2.0上的VBO GLDraweElements和GLVertexAttribute指针不显示任何内容,ios,opengl-es,opengl-es-2.0,vbo,Ios,Opengl Es,Opengl Es 2.0,Vbo,我可以使用着色器、GLVertexAttributePointer和GLDrawArray显示纹理,如下所示: 初始化 抽签 glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 但我很难转换到VBO、着色器和gldrawer元素。这是我到目前为止的代码,但没有显示任何内容: 标题 typedef struct MyVertex { float x, y, z; //Vertex float nx, ny, nz; //Normal

我可以使用着色器、GLVertexAttributePointer和GLDrawArray显示纹理,如下所示:

初始化

抽签

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
但我很难转换到VBO、着色器和gldrawer元素。这是我到目前为止的代码,但没有显示任何内容:

标题

typedef struct MyVertex
{
    float x, y, z;        //Vertex
    float nx, ny, nz;     //Normal
    float s0, t0;         //Texcoord0
} MyVertex;

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
初始化


你的代码看起来并没有太大的错误,所以这一次魔鬼就在细节的某个地方。我的猜测是,您使用的结构及其数据字段的对齐方式与传递给OpenGL的偏移量不匹配

我建议您使用stddef.h中的宏以可移植的方式获取数据字段的偏移量。

根据,
GL\u INT
不是用于
glpaurements
中索引的有效类型。尝试使用
unsigned int
s作为索引(当然还有
glpaurements
中的
GL\u unsigned\u int
)。您仍然可以使用
int
数据作为索引,但由于
gldrawerelements
需要
GL\u UNSIGNED\u int
,因此使数组
UNSIGNED int
更加一致


编辑:在研究了规范(基于您的标记,我采用了ES 2.0规范)之后,他们似乎进一步将其限制为无符号字节和无符号短字符。我不知道它在iOS中是否有限制,但我们可以得出结论,数据至少必须是未签名的。另一方面,我还没有发现任何关于错误类型参数引发的可能的
GL\u INVALID\u ENUM
错误的语句,但是得到一个是合理的。

这引出了以下一点:Zeophlite应该测试GL是否在调试中报告错误。GLDRAILEments应该报告GL_INVALID_ENUM。@尽管它显然应该报告GL_INVALID_ENUM,但在给定的引用链接上没有列出错误的类型参数作为GL_INVALID_ENUM的源。这就是为什么我没有在我的回答中明确指出这一点。但是链接仍然说只有未签名的才是有效的。也许我应该检查一下规范以获得澄清。是的,关于错误的规范适用于所有枚举,而不是每个命令。“如果一个需要枚举值的命令被传递了一个符号常量,而该符号常量不是该命令所允许的符号常量之一,则会生成错误INVALID_ENUM error。”感谢Christian的回答,我实际上事先就解决了这个问题,但StackOverflow不允许我发布答案。另外@Bahbar,没有生成错误!(我删除了我帖子中的错误检查代码)@Zeophlite:那是一个驱动程序错误。归档:D?
typedef struct MyVertex
{
    float x, y, z;        //Vertex
    float nx, ny, nz;     //Normal
    float s0, t0;         //Texcoord0
} MyVertex;

#define BUFFER_OFFSET(i) ((char *)NULL + (i))
glGenBuffers(1, &VertexVBOID);

glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);

MyVertex pvertices[4];
//Fill the pvertices array
pvertices[0].x = -0.5f;
pvertices[0].y = -0.33f;
pvertices[0].z = 0.0;
pvertices[0].nx = 0.0;
pvertices[0].ny = 0.0;
pvertices[0].nz = 1.0;
pvertices[0].s0 = 0.0;
pvertices[0].t0 = 0.0;

pvertices[1].x = 0.5f;
pvertices[1].y = -0.33f;
pvertices[1].z = 0.0;
pvertices[1].nx = 0.0;
pvertices[1].ny = 0.0;
pvertices[1].nz = 1.0;
pvertices[1].s0 = 1.0;
pvertices[1].t0 = 0.0;

pvertices[2].x = -0.5f;
pvertices[2].y = 0.33f;
pvertices[2].z = 0.0;
pvertices[2].nx = 0.0;
pvertices[2].ny = 0.0;
pvertices[2].nz = 1.0;
pvertices[2].s0 = 0.0;
pvertices[2].t0 = 1.0;

pvertices[3].x = 0.5f;
pvertices[3].y = 0.33f;
pvertices[3].z = 0.0;
pvertices[3].nx = 0.0;
pvertices[3].ny = 0.0;
pvertices[3].nz = 1.0;
pvertices[3].s0 = 1.0;
pvertices[3].t0 = 1.0;

glBufferData(GL_ARRAY_BUFFER, sizeof(MyVertex)*4, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(MyVertex)*4, pvertices);


glGenBuffers(1, &IndexVBOID);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);

int pindices[6];
pindices[0]=0;
pindices[1]=1;
pindices[2]=2;
pindices[3]=2;
pindices[4]=1;
pindices[5]=3;
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*6, NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, sizeof(int)*6, pindices);
glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID);

glEnableVertexAttribArray(PositionTag);
glEnableVertexAttribArray(NormalTag);
glEnableVertexAttribArray(TexCoord0Tag);

glVertexAttribPointer(PositionTag, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(0));
glVertexAttribPointer(NormalTag, 3, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(12));
glVertexAttribPointer(TexCoord0Tag, 2, GL_FLOAT, GL_FALSE, 32, BUFFER_OFFSET(24));

//    glDrawRangeElements(GL_TRIANGLES, x, y, z, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID);
glDrawElements(GL_TRIANGLES, 3, GL_INT, 0);