标题里所说的“箭头”,其实分两种:两条线段组成的箭头,或是顶部一个小三角形组成的箭头。用OpenGL实现起来都不麻烦,下面这段代码能同时绘出这两种箭头,其中红色的是水平线,蓝色的是垂直线。红线带线段箭头,蓝色带三角实心箭头。
static volatile int flag = 0; - (void) render { // Replace the implementation of this method to do your own custom drawing // This application only creates a single context which is already set current at this point. // This call is redundant, but needed if dealing with multiple contexts. [EAGLContext setCurrentContext:context]; // This application only creates a single default framebuffer which is already bound at this point. // This call is redundant, but needed if dealing with multiple framebuffers. glBindFramebufferOES(GL_FRAMEBUFFER_OES, defaultFramebuffer); static const struct { GLfloat vertices[3]; }line1Vertices[] = { {0.0f, -0.5f, 0.0f}, {0.0f, 0.5f, 0.0f}, {-0.1f, 0.3f, 0.0f}, {0.0f, 0.5f, 0.0f}, {0.1f, 0.3f, 0.0f} }, line2Vertices[] = { // for line {0.0f, -0.5f, 0.0f}, {0.0f, 0.5f, 0.0f}, // for triangle {-0.1f, 0.5f, 0.0f}, {0.1f, 0.5f, 0.0f}, {0.0f, 0.6f, 0.0f} }; if(!flag) { if (1) { // Perform similar steps to create and attach a depth renderbuffer. glGenRenderbuffersOES(1, &depthRenderbuffer); glBindRenderbufferOES(GL_RENDERBUFFER_OES, depthRenderbuffer); glRenderbufferStorageOES(GL_RENDERBUFFER_OES, GL_DEPTH_COMPONENT16_OES, backingWidth, backingHeight); glFramebufferRenderbufferOES(GL_FRAMEBUFFER_OES, GL_DEPTH_ATTACHMENT_OES, GL_RENDERBUFFER_OES, depthRenderbuffer); } // Initialize the OpenGL State glEnable(GL_DEPTH_TEST); glEnable(GL_CULL_FACE); glFrontFace(GL_CCW); glCullFace(GL_BACK); glEnableClientState(GL_VERTEX_ARRAY); //glEnableClientState(GL_COLOR_ARRAY); glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glViewport(0, 0, backingWidth, backingHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); GLfloat delta; if(backingWidth < backingHeight) { delta = (GLfloat)backingHeight / (GLfloat)backingWidth; glOrthof(-1.0f, 1.0f, -delta, delta, 1.0f, 5.0f); } else { delta = (GLfloat)backingWidth / (GLfloat)backingHeight; glOrthof(-delta, delta, -1.0f, 1.0f, 1.0f, 5.0f); } glMatrixMode(GL_MODELVIEW); // For the first line glLoadIdentity(); glTranslatef(-0.3f, 0.0f, -1.0f); // First rotate around z axis glRotatef(-90.0f, 0.0f, 0.0f, 1.0f); glPushMatrix(); // For the second line glLoadIdentity(); glTranslatef(0.7f, 0.0f, -1.0f); flag = 1; } GLfloat bufferedMatrix[16]; // Drawing code here. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw the second line glColor4f(0.0f, 0.0f, 1.0f, 1.0f); glVertexPointer(3, GL_FLOAT, 0, line2Vertices); glDrawArrays(GL_LINES, 0, 2); glDrawArrays(GL_TRIANGLES, 2, 3); // Save the matrix for the second line's transformation glGetFloatv(GL_MODELVIEW_MATRIX, bufferedMatrix); // Draw the first line glPopMatrix(); glColor4f(1.0f, 0.0f, 0.0f, 1.0f); glVertexPointer(3, GL_FLOAT, 0, line1Vertices); glDrawArrays(GL_LINE_STRIP, 0, 5); // Save the matrix for the first line's transformation glPushMatrix(); // Restore the matrix for the second line's tranformation glLoadMatrixf(bufferedMatrix); // This application only creates a single color renderbuffer which is already bound at this point. // This call is redundant, but needed if dealing with multiple renderbuffers. glBindRenderbufferOES(GL_RENDERBUFFER_OES, colorRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; }
代码基于iPhoneOS3.1.3版的OpenGL ES应用程序的模板