Ios GLES2.0上的VBO GLDraweElements和GLVertexAttribute指针不显示任何内容
我可以使用着色器、GLVertexAttributePointer和GLDrawArray显示纹理,如下所示: 初始化 抽签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
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);