2013-10-19 2 views
0

glEvalCoord에서 값을 읽으려고하지만 정확한 값을 얻지 못하고 있습니다. 내 코드는 내가 확실하지 오전하지만 곡선의 x, y 및 z 좌표를 각각 나에게 30 개 * 3 값을주지해야한다, 지금glEeedCoord를 glFeedback과 함께 사용하면 예상대로 출력되지 않습니다.

GLfloat ctrlpoints[4][3] = { 
    { -4.0, -4.0, 0.0}, { -2.0, 4.0, 0.0}, 
    { 2.0, -4.0, 0.0}, { 4.0, 4.0, 0.0}}; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glEnable(GL_LIGHTING); 
    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); 
    glEnable(GL_MAP1_VERTEX_3); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    GLint size; 
    GLfloat feedBuffer[1024]; 

    glFeedbackBuffer (1024, GL_3D, feedBuffer); 
    glRenderMode (GL_FEEDBACK); 
    glBegin (GL_POINTS); 
    for (int i=0; i<=30; ++i) 
    { 
     GLfloat t = GLfloat(i)/30; 
     glEvalCoord1f(t); 
    } 
    glEnd(); 
    size = glRenderMode (GL_RENDER); 
    cerr<<size<<endl; 
} 

입니까 ?? 그러나 나는 단지 7 * 3 값을 얻고 있습니다. 그리고 크기의 출력은 28입니다.

답변

1

귀하의 투영/모델 뷰 쌍이 일부 포인트를 클리핑하기 때문에 귀하의 size28이라고 생각합니다.

"In feedback mode, each primitive that would be rasterized ... generates a block of values that's copied into the feedback array."

이 시도 :

#include <GL/glut.h> 
#include <iostream> 

using namespace std; 

void display() 
{ 
    glClear(GL_COLOR_BUFFER_BIT); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    double w = glutGet(GLUT_WINDOW_WIDTH); 
    double h = glutGet(GLUT_WINDOW_HEIGHT); 
    double ar = w/h; 
    glOrtho(-5 * ar, 5 * ar, -5, 5, -1, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    GLfloat ctrlpoints[4][3] = 
    { 
     { -4.0, -4.0, 0.0 }, { -2.0, 4.0, 0.0 }, 
     { 2.0, -4.0, 0.0 }, { 4.0, 4.0, 0.0 } 
    }; 

    glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); 
    glEnable(GL_MAP1_VERTEX_3); 

    GLfloat feedBuffer[1024]; 
    glFeedbackBuffer (1024, GL_3D, feedBuffer); 
    glRenderMode (GL_FEEDBACK); 

    glPointSize(5); 
    glColor3ub(255, 255, 255); 
    glBegin (GL_POINTS); 
    for (int i=0; i<=30; ++i) 
    { 
     GLfloat t = GLfloat(i)/30; 
     glEvalCoord1f(t); 
    } 
    glEnd(); 

    GLint size = glRenderMode (GL_RENDER); 
    cerr << size << endl; 

    glutSwapBuffers(); 
} 

int main(int argc, char **argv) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); 
    glutInitWindowSize(640, 480); 
    glutCreateWindow("GLUT"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
    return 0; 
} 

내가 약간 큰 투영 매트릭스를 추가했다. 그게

I는 size124의 얻을 : 점당

  • 31 점 × 3 수레 = 93
  • 31 점 점당 * 1 GL_POINT_TOKEN = 31

31 + 91 = 124

+0

좋습니다. 감사 – pcoder

관련 문제