2013-05-10 88 views
1

我可以使用以下代码在iPhone上成功地在iPhone上的OpenGL ES 2.0中绘制线条。我正在禁用纹理和混合,但我的GLKBaseEffects useConstantColor似乎没有颜色线 - 它总是黑色!我无法设置颜色!我怎样才能做到这一点?iOS OpenGL ES 2.0绘制3D线条和设置颜色

// Turn off texturing 
self.effect.texture2d0.enabled = NO; 
self.effect.texture2d1.enabled = NO; 

// Turn off blending 
glDisable(GL_BLEND); 
glDisable(GL_TEXTURE_2D); 

// Draw a line 
self.effect.useConstantColor = GL_TRUE; 

// Make the line a red color 
self.effect.constantColor = GLKVector4Make(
              1.0f, // Red 
              0.0f, // Green 
              0.0f, // Blue 
              1.0f);// Alpha 

// Prepare the effect for rendering 
[self.effect prepareToDraw]; 

GLfloat line[] = { -1.0, -1.0, -6.0, 1.0, 1.0, 5.0, 1.0, -1.0, 2.0 }; 

// Create an handle for a buffer object array 
GLuint bufferObjectNameArray; 

// Have OpenGL generate a buffer name and store it in the buffer object array 
glGenBuffers(1, &bufferObjectNameArray); 

// Bind the buffer object array to the GL_ARRAY_BUFFER target buffer 
glBindBuffer(GL_ARRAY_BUFFER, bufferObjectNameArray); 

// Send the line data over to the target buffer in GPU RAM 
glBufferData(
      GL_ARRAY_BUFFER, // the target buffer 
      sizeof(line),  // the number of bytes to put into the buffer 
      line,    // a pointer to the data being copied 
      GL_STATIC_DRAW); // the usage pattern of the data 

// Enable vertex data to be fed down the graphics pipeline to be drawn 
glEnableVertexAttribArray(GLKVertexAttribPosition); 

// Specify how the GPU looks up the data 
glVertexAttribPointer(
         GLKVertexAttribPosition, // the currently bound buffer holds the data 
         3,      // number of coordinates per vertex 
         GL_FLOAT,    // the data type of each component 
         GL_FALSE,    // can the data be scaled 
// * INCORRECT *  3,      // how many bytes per vertex (3 floats per vertex) 
         0,      // stride (0 bytes between coordinates.) ~Olie 
// * INCORRECT *  NULL);     // offset to the first coordinate, in this case 0 
         line);     // pointer to the buffer to draw. ~Olie 

// Set the line width 
glLineWidth(5.0); 

// Render the line 
glDrawArrays(GL_LINE_LOOP, 0, 3); 

// Turn on blending 
glDisable(GL_BLEND); 

// Turn on texturing 
self.effect.texture2d0.enabled = YES; 
self.effect.texture2d1.enabled = YES; 
+0

在研究回答了我自己的(不同的)问题,我遇到了这个职位。一个更正:在上面的示例中,glVertexAttribPointer中的2nd-last参数是* stride *,并且应该为0,而不是3.我在注释中编辑过,但没有更改实际代码,以防您想要评论,编辑或其他,你自己。最后一个参数是一个指向坐标数组的指针。 (我稍微犹豫的一个原因是因为我不知道当你使用绑定缓冲区时事情是否有不同的作用。) – Olie 2013-05-28 00:09:38

回答

1

尝试添加此:

// Turn off lighting 
self.effect.light0.enabled = GL_FALSE;