Hello everyone,
I have finally finished my Wavefront OBJ parser (sort of), and trying to test a cube shape, which is unfortunately failing for me.
To begin with i only want to draw the cube actual cube, i dont care about textures or normals!
So this is my Wavefront OBJ file:
Code :v -0.307796 0.00433517 0 v 0.299126 0.00433517 0 v 0.299126 0.00433517 0.48337 v -0.307796 0.00433517 0.48337 v -0.307796 0.364153 0.48337 v 0.299126 0.364153 0.48337 v 0.299126 0.364153 0 v -0.307796 0.364153 0 f 7/1/1 3/2/2 2/3/3 f 3/4/4 7/5/5 6/6/6 f 5/7/7 1/8/8 4/9/9 f 1/10/10 5/11/11 8/12/12 f 7/13/13 1/14/14 8/15/15 f 1/16/16 7/17/17 2/18/18 f 3/19/19 5/20/20 4/21/21 f 5/22/22 3/23/23 6/24/24 f 5/25/25 7/26/26 8/27/27 f 7/28/28 5/29/29 6/30/30 f 3/31/31 1/32/32 2/33/33 f 1/34/34 3/35/35 4/36/36
So basically the faces is written in following form: f v1/vt1/vn1 v2/vt2/vn2 v3/vt3/vn3 ...
Since i only want the index of the vertices (dont care for normals and textures) i save vertices and my indices as:
Code :const Vertex Vertices[] = { {-0.307796,0.00433517,0}, {0.299126,0.00433517,0}, {0.299126,0.00433517,0.48337}, {-0.307796,0.00433517,0.48337}, {-0.307796,0.364153,0.48337}, {0.299126,0.364153,0.48337}, {0.299126,0.364153,0}, {-0.307796,0.364153,0} }; const GLubyte Indices[] = { 7, 3, 2, 3, 7, 6, 5, 1, 4, 1, 5, 8, 7, 1, 8, 1, 7, 2, 3, 5, 4, 5, 3, 6, 5, 7, 8, 7, 5, 6, 3, 1, 2, 1, 3, 4 };
And all the OpenGL stuff (objective-C):
Code :- (void)setupRenderBuffer { glGenRenderbuffers(1, &_colorRenderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; } - (void)setupDepthBuffer { glGenRenderbuffers(1, &_depthRenderBuffer); glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height); } - (void)setupFrameBuffer { GLuint framebuffer; glGenFramebuffers(1, &framebuffer); glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, _colorRenderBuffer); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, _depthRenderBuffer); } - (GLuint)compileShader:(NSString*)shaderName withType:(GLenum)shaderType { // 1 NSString* shaderPath = [[NSBundle mainBundle] pathForResource:shaderName ofType:@"glsl"]; NSError* error; NSString* shaderString = [NSString stringWithContentsOfFile:shaderPath encoding:NSUTF8StringEncoding error:&error]; if (!shaderString) { NSLog(@"Error loading shader: %@", error.localizedDescription); exit(1); } // 2 GLuint shaderHandle = glCreateShader(shaderType); // 3 const char * shaderStringUTF8 = [shaderString UTF8String]; int shaderStringLength = [shaderString length]; glShaderSource(shaderHandle, 1, &shaderStringUTF8, &shaderStringLength); // 4 glCompileShader(shaderHandle); // 5 GLint compileSuccess; glGetShaderiv(shaderHandle, GL_COMPILE_STATUS, &compileSuccess); if (compileSuccess == GL_FALSE) { GLchar messages[256]; glGetShaderInfoLog(shaderHandle, sizeof(messages), 0, &messages[0]); NSString *messageString = [NSString stringWithUTF8String:messages]; NSLog(@"%@", messageString); exit(1); } return shaderHandle; } - (void)compileShaders { // 1 GLuint vertexShader = [self compileShader:@"SimpleVertex" withType:GL_VERTEX_SHADER]; GLuint fragmentShader = [self compileShader:@"SimpleFragment" withType:GL_FRAGMENT_SHADER]; // 2 GLuint programHandle = glCreateProgram(); glAttachShader(programHandle, vertexShader); glAttachShader(programHandle, fragmentShader); glLinkProgram(programHandle); // 3 GLint linkSuccess; glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess); if (linkSuccess == GL_FALSE) { GLchar messages[256]; glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]); NSString *messageString = [NSString stringWithUTF8String:messages]; NSLog(@"%@", messageString); exit(1); } // 4 glUseProgram(programHandle); // 5 _positionSlot = glGetAttribLocation(programHandle, "Position"); _colorSlot = glGetAttribLocation(programHandle, "SourceColor"); glEnableVertexAttribArray(_positionSlot); glEnableVertexAttribArray(_colorSlot); _projectionUniform = glGetUniformLocation(programHandle, "Projection"); _modelViewUniform = glGetUniformLocation(programHandle, "Modelview"); } - (void)setupVBOs { GLuint vertexBuffer; glGenBuffers(1, &vertexBuffer); glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer); glBufferData(GL_ARRAY_BUFFER, sizeof(Vertices), Vertices, GL_STATIC_DRAW); GLuint indexBuffer; glGenBuffers(1, &indexBuffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBuffer); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(Indices), Indices, GL_STATIC_DRAW); } - (void)render:(CADisplayLink*)displayLink { glClearColor(0, 104.0/255.0, 55.0/255.0, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); CC3GLMatrix *projection = [CC3GLMatrix matrix]; float h = 4.0f * self.frame.size.height / self.frame.size.width; [projection populateFromFrustumLeft:-2 andRight:2 andBottom:-h/2 andTop:h/2 andNear:4 andFar:10]; glUniformMatrix4fv(_projectionUniform, 1, 0, projection.glMatrix); CC3GLMatrix *modelView = [CC3GLMatrix matrix]; [modelView populateFromTranslation:CC3VectorMake(sin(CACurrentMediaTime()), 0, -7)]; _currentRotation += displayLink.duration * 90; [modelView rotateBy:CC3VectorMake(_currentRotation, _currentRotation, 0)]; glUniformMatrix4fv(_modelViewUniform, 1, 0, modelView.glMatrix); // 1 glViewport(0, 0, self.frame.size.width, self.frame.size.height); // 2 glVertexAttribPointer(_positionSlot, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), 0); glVertexAttribPointer(_colorSlot, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (GLvoid*) (sizeof(float) * 3)); // 3 // glDrawElements(GL_TRIANGLES, sizeof(Indices)/sizeof(Indices[0]), GL_UNSIGNED_BYTE, 0); glDrawElements(GL_TRIANGLES, sizeof(Indices), GL_UNSIGNED_BYTE, 0); [_context presentRenderbuffer:GL_RENDERBUFFER]; }
So to get back to the actual issue, i do not exactly get what should have looked like a actual cube. It looks like some bits and pieces are missing in terms of connections to vertices.
I have taken a screenshot to show what i am viewing:
![]()