OpenGL ES 1을 사용하여 점선을 그리는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1806028

  •  05-07-2019
  •  | 
  •  

문제

OpenGL에서 점선을 그리려면 glLineStipple을 사용할 수 있지만 OpenGL ES 1에서 동일한 효과를 얻으려면 어떻게 해야 합니까?

도움이 되었습니까?

해결책

선은 삼각형처럼 질감을 만들 수 있습니다. 알파 테스트를 활성화하고, 알파 텍스처를 적용하고, 텍스처 좌표를 설정하고, 즐기십시오.

다른 팁

실제로 for 루프를 사용하여 점선이나 점선을 깨달았지만 그리기 방법에 대한 선 유형 링크로 사용하는 것은 여전히 ​​의미가 없습니다. 아래에는 점선과 점선의 코드가 있습니다.점선:

(void)drawVerticalDotedInternalGrid{
    float a,b;
    int drawCount =0;
    GLfloat dotedInternalGrid[1296];

    for (a = -0.5f; a <= 0.5f; a +=0.5f) {
        for (b = -0.875f; b <=0.925f; b += 0.025f) 
        {           
            dotedInternalGrid[drawCount] = b;
            drawCount++;
            dotedInternalGrid[drawCount] = a;
            drawCount++;
        };      
    };
    glPointSize(1.0f);
    glColor4f(0.863f,0.863f,0.863f,0.8f); //line color
    glVertexPointer(2, GL_FLOAT, 0, dotedInternalGrid);
    glEnableClientState(GL_VERTEX_ARRAY);   
    glDrawArrays(GL_POINTS, 0, 648);        
    glDisableClientState(GL_VERTEX_ARRAY);
}

점선:

(void)drawVerticalDashedInternalGridH{
    GLfloat dashedLine[1296];
    float a,b;
    int i =0;

    //-0.4----0.4 // -0.875----0.900
    for (a = -0.4f; a <= 0.4f; a +=0.1f) {
        for (b =-0.825f; b <=0.950f; b+=0.025f) {                           
            dashedLine[i] = b;              
            i++;
            dashedLine[i] = a;
            i++;
        };
    };

    //glLineWidth(1.0f);
    glColor4f(0.863f,0.863f,0.863f,1.f); //line color
    glVertexPointer(2, GL_FLOAT, 0, dashedLine);
    glEnableClientState(GL_VERTEX_ARRAY);   
    glDrawArrays(GL_LINES, 0, 648); 
    glDisableClientState(GL_VERTEX_ARRAY);
}

물론 코드가 특정 좌표의 직사각형 영역에 그려지는 것을 볼 수 있습니다. 귀찮은 것은 dotedInternalGrid[1296]; 그리기 방법 사용을 위해 동적으로 배열의 크기와 그릴 라인 수도 마찬가지입니다.

쉽게 설명하기 위해 Drawhorizontaldashedline ()를 먼저 넣었습니다.

이해하려면이 이미지를 클릭하십시오. 평판 때문에이 게시물에 이미지를 넣을 수 없습니다.정점 시각화

+(void)drawHorizontalDashedLine:(GLfloat)x1 x2:(GLfloat)x2 y:(GLfloat)y {

    //Parameters
    GLfloat DASH_LENGTH = 4.0f;
    GLfloat GAP_LENGTH = 2.0f;
    GLfloat LINE_THICKNESS = 1.5f;

    //Calculate how many dashes require to draw the whole line
    GLfloat fHorizontalLength = fabsf(x2-x1);
    int nDashedLineCount = fHorizontalLength / (DASH_LENGTH + GAP_LENGTH);
    int nVerticesSize = nDashedLineCount * 4; //A dashed line has 4 values(2 points)

    //Vertex
    GLfloat vertices[nVerticesSize];

    //The first dashed line vertices
    vertices[0] = (x1 < x2)? x1 : x2;
    vertices[1] = y;
    vertices[2] = (x1 < x2)? x1 : x2 + DASH_LENGTH;
    vertices[3] = y;

    //The other vertices of dashed lines
    for (int nIndex=4; nIndex < nVerticesSize; nIndex=nIndex+4) {
        vertices[nIndex]   = vertices[nIndex-2] + GAP_LENGTH;
        vertices[nIndex+1] = y;
        vertices[nIndex+2] = vertices[nIndex] + DASH_LENGTH;
        vertices[nIndex+3] = y;

        //NSLog(@"Point1(%.2f, %.2f)", vertices[nIndex], vertices[nIndex+1]);
        //NSLog(@"Point2(%.2f, %.2f)", vertices[nIndex+2], vertices[nIndex+3]);
    }

    //Draw the arrays
    glPushMatrix();
    glLineWidth(LINE_THICKNESS);
    glVertexPointer (2, GL_FLOAT, 0, vertices);
    glDrawArrays (GL_LINES, 0, nVerticesSize/2);
    glPopMatrix();
}

DrawDashedLine ().

Trigonometric 기능을 사용하여 길이를 얻었습니다.

+(void)drawDashedLine:(CGPoint)point1 point2:(CGPoint)point2 {

    //Parameters
    GLfloat DASH_LENGTH = 3.0f;
    GLfloat GAP_LENGTH = 1.0f;
    GLfloat LINE_THICKNESS = 1.5f;

    //Calculate how many dashes require to draw the whole line
    GLfloat fWidth = point2.x - point1.x;
    GLfloat fHeight = point2.y - point1.y;
    GLfloat fRadian = atan2(fHeight, fWidth);

    float fLineLength = sqrtf(powf(fWidth, 2) + powf(fHeight, 2));
    int nDashedLineCount = fabsf(fLineLength / (DASH_LENGTH + GAP_LENGTH));
    int nVerticesSize = nDashedLineCount * 4; //A dashed line has 4 values(2 points)

    //Vertex
    GLfloat vertices[nVerticesSize];

    //The first dashed line vertices
    vertices[0] = point1.x;
    vertices[1] = point1.y;
    vertices[2] = point1.x + cosf(fRadian) * DASH_LENGTH;
    vertices[3] = point1.y + sinf(fRadian) * DASH_LENGTH;

    //The other vertices of dashed lines
    for (int nIndex=4; nIndex < nVerticesSize; nIndex=nIndex+4) {
        vertices[nIndex]   = vertices[nIndex-2] + cosf(fRadian) * GAP_LENGTH;
        vertices[nIndex+1] = vertices[nIndex-1] + sinf(fRadian) * GAP_LENGTH;
        vertices[nIndex+2] = vertices[nIndex]   + cosf(fRadian) * DASH_LENGTH;
        vertices[nIndex+3] = vertices[nIndex+1] + sinf(fRadian) * DASH_LENGTH;

        //NSLog(@"DrawDash Point1(%.2f, %.2f)", vertices[nIndex], vertices[nIndex+1]);
        //NSLog(@"DrawDash Point2(%.2f, %.2f)", vertices[nIndex+2], vertices[nIndex+3]);
    }

    //Draw the arrays
    glPushMatrix();
    glLineWidth(LINE_THICKNESS);
    glVertexPointer (2, GL_FLOAT, 0, vertices);
    glDrawArrays (GL_LINES, 0, nVerticesSize/2);
    glPopMatrix();
}
glPushAttrib(GL_ENABLE_BIT); 
# glPushAttrib is done to return everything to normal after drawing

glLineStipple(1, 0xAAAA);  # [1]
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex3f(-.5,.5,-.5);
glVertex3f(.5,.5,-.5);
glEnd();

glPopAttrib();
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top