2011-07-29 4 views
0

OpenGL에서 모양을 그리는 도구를 만들고 Windows 모양에서 해당 모양의 속성 값을 수정하려고합니다. 그래서 내 도형이 사각형 인 경우 사각형의 크기, 색상 등을 사용자가 제어 할 수있는 양식을 만듭니다. openGL 코드를 관리되는 C++ 및 C# 형식으로 작성했으며 이러한 모양 중 일부는 더 복잡해 졌으므로 성능 및 예측 가능성을 위해 표시 목록을 작성하기로 결정했습니다.표시 목록은 실행되지 않습니다

모양에 대한 생성자에 표시 목록을 정의하고 render 메서드에서 표시 목록을 호출합니다.

내 디스플레이 목록이 전혀 실행되지 않습니다. 표시 목록 외부에서 렌더링하는 부분은 렌더링되지만 표시 목록 내의 부분은 렌더링되지 않습니다. 사각형의 테두리가 렌더링 될이 예에서

//c# side 
GLRectangle rect 
public CSharpRectangle() { 
    rect = new GLRectangle(); 
} 

//managed c++ side 
public GLRectangle() { 
    width = 50; 
    height = 50; 
    //initialize more values 
    rectDL = glGenLists(1); 
    glNewList(rectDL, GL_COMPILE); 
     renderRect(); 
    glEndList(); 
} 
public render() { 
    //Draw border 
glBegin(GL_LINE_LOOP); 
    glVertex2f(0, 0); 
    glVertex2f(width, 0); 
    glVertex2f(width, height); 
    glVertex2f(0, height); 
glEnd(); 

    //Draw interior 
    glCallList(rectDL); 
} 
private renderRect() { 
    glRectf(0,0,width,height); 
} 

,하지만 난 표시 목록을 대체하는 경우 사각형 자체가 ... 렌더링되지 않습니다 : 여기에

내 프로세스의 일부 샘플 코드입니다 단순히 메서드 호출을하면 사각형이 잘 렌더링됩니다. 왜 이런 일이 일어날 지 아는 사람이 있습니까?

+2

renderRect 함수도 게시 할 수 있습니까? 도움이 될 수도 있습니다. – Dany

+0

renderRect 메서드가 추가되었습니다. – eternalking

답변

1

나는 2 센트를주고 싶다.

당신의 질문에있는 코드가 나에게 맞는 것 같아요, 아마 당신의 응용 프로그램에 디스플레이 목록을 실행할 수 없게 만드는 뭔가가있을 것입니다.

내가 생각할 수있는 유일한 점은 디스플레이 목록을 컴파일 할 때 (실제로 GlRectangle 생성자를 실행할 때) 현재 컨텍스트가 없다는 것입니다. 그래서, 그 루틴은 glMakeCurrent를 호출 한 동일한 스레드에서 실행됩니까? 그 루틴은 glMakeCurrent 후에 호출됩니까?

또한 각 OpenGL 루틴 이후 glGetError를 검사하여 작업의 유효성을 검사하십시오. 오류를 반환하는 경우 코드에서 무엇이 잘못되었는지 알 수 있습니다.

+0

그게 문제 였어, 나는 모양을 인스턴스화 한 후 컨텍스트를 만들고 있었다. 제 실제 프로그램은 제가 제시 한 예보다 훨씬 복잡합니다. 그래서 처음에는 그것을 알아 채지 못했습니다. 당신의 도움을 주셔서 감사합니다! – eternalking

-2

당신이 원하는 것을 얻지 못할 수도있는 이유는 더 이상 존재하지 않기 때문입니다. 나는 openGL Red book을 읽고 있었는데, OpenGL 3.1 이상에서는 표시 목록이 더 이상 사용되지 않는다는 것을 알게되었습니다. 나는 이유를 더 이상 기억하지 못한다.하지만 VAO와 VBO를 망쳐 놓았 기 때문에 나는 믿는다. OpenGL 3.1보다 높은 버전을 사용한다면 더 이상 표시 목록을 얻을 수 없습니다.

+0

-1, 표시 목록은 더 이상 사용되지 않지만 호환성을 위해 모든 곳에서 지원됩니다. 더 이상 사용되지 않는 것은 그들이 거기에 있음을 의미하지만 사용하지 말 것을 권합니다. – Hannesh

+0

더 자세히 읽으십시오. 더 이상 사용되지 않습니다. 제거를 위해 혼합되어 있으며 사용하지 말 것을 권장합니다. 누구든지 (ATI, Nvidia, ...) 제거하기로 결정한 경우 자유롭게 수행 할 수 있으며 ATI는 성능이 떨어졌습니다. 이전 OpenGL 버전을 사용하고 싶지 않다면, 더 이상 사용되지 않는 것들에 대해 새 프로젝트를 빌드해서는 안됩니다. 사용 중지 된 모든 항목에 대해 호환성을 유지한다면 비추천에 대한 아이디어는 무엇입니까? – Raven

+1

@Raven deprecation은 렌더러로 사용하는 현재 OpenGL 버전과 관련이 있습니다. 지원 중단 버전은 3.0부터 도입되었으므로 더 낮은 버전은 지원 중단 된 API를 지원합니다. 호환성 프로파일을 사용하는 경우를 제외하고는 포워드 호환 가능 컨텍스트에서 더 이상 사용되지 않는 기능을 사용할 수 없습니다. – Luca