2014-10-20 1 views
-3

큰 프로그램이 있습니다. 그런 방식으로 OpenGL의 비 deprecated 기능을 사용하도록 변경해야합니다. 별도의 프로그램에서 원통, 구 등을 렌더링 할 수 있었지만 큰 프로그램에서 원통형 코드를 통합하려고하면 예상 결과가 표시되지 않습니다.기존 대형 프로그램을 비 지원되는 OpenGL로 변환하는 방법

glUseProgram(Program); 

glUseProgram(0); 

을 프로그램이 매우 크기 때문에, 고정 된 함수 파이프 라인 옆 효과 측면에서도 : I 코드는 다음의 것이 가능하고, 각각 프로그램 파이프 비활성화 가정되었다. 나는 고정 함수 파이프 라인이 프로그래머블 파이프 라인을 방해하고 있다고 생각한다. 이미 언급했듯이 실린더를 따로 따로 렌더링 할 수 있었기 때문에 이것을 믿습니다. 그러나 큰 프로그램에서이 코드를 얻으려고하면 예상 된 결과를 얻지 못했습니다.

어떻게해야합니까? 여기

+2

혈액, 땀 및 눈물. 그 외에는 계속해서 충분한 정보 (코드)를 제공하지 않습니다. –

답변

0

내가 찾은 좋은 설명 : 여기 http://www.jeffwofford.com/?p=635 과 : mhagain의 https://www.opengl.org/discussion_boards/showthread.php/184409-Migration-from-Fixed-pipeline-to-Programmable-pipeline

두 번째 링크의 의견은 저를 도왔다. 여기에 두 가지 단계가 있습니다,

확인을하고 차라리에서 을 모두 수행하는 것보다 한 번에 하나씩 가지고가는 경우에 당신을 위해 많은 쉽게 갈 것이라고 조언 것 : 나는 아래 그를 인용하고 동시.

첫 번째 단계는 즉시 모드에서 버퍼 개체로 이동하는 것입니다. 두 번째 단계는 고정 된 정점 및 조각 처리를 쉐이더로 옮기는 것입니다.

내가 먼저 두 번째 단계, 및 이유를 가지고하는 것이 좋습니다 이유 장소에 이미 쉐이더 인프라를 가진 것은 당신이 객체 버퍼 즉각적인 모드 에서 움직임에 대해 만드는 것이다 결정의 일부 을 할 수 있다는 것입니다 조금 더 쉬워.

이것은 표면에 보이는 것처럼 어려운 일은 아닙니다. 같은 일을 쉐이더에 당신은 예를 들어, 약 GL 2.1 상당 포트는 당신의 정점 변환 및 조명 변환 할 수 있고, 당신의 조각 처리 (즉 glTexEnv 호출). 이 단계에서 현실적인 목표는 더 이상 포트 끝에 고정 파이프 라인을 사용하지 않는 기능적으로 동일한 프로그램 을 갖는 것입니다. 이 단계에서 추가 기능을 추가하려면 을 시도하면 IMO가시기 상조입니다. 이렇게하면

당신이 다음 장면 도면을 모두 해제 한 번에 다시 한 단계에서 그것을 가지고 할 수 있어야한다. 내가 전에 몇 유사한 포트를 해봤 도면이 비교적 간단하고 단지 거기가는 것은 사용 쉐이더 조합의 작은 소수가 될 나는 일반적으로 2D GUI 코드로 시작하는 것을 선호합니다. 따라서 2D GUI를 제외한 모든 도면을 비활성화 (예 : 주석 처리) 한 다음 직각 행렬로 위치를 변환하는 간단한 버텍스 쉐이더를 작성하고 간단한 조각 쉐이더를 작성하여 평면 색상 (흰색 또는 무엇이든간에 은 쉽게 프로그램이 작동하는지 확인하려면 표시), 프로그램을 에 연결하고 glUseProgram, draw합니다.문제를 해결 한 다음 질감을 추가하십시오. 그런 다음 색상을 가져 오십시오. 그런 다음 다른 GUI 효과 을 가져 오십시오. 한 번에 한 단계 씩 좋고 천천히 진행하면 이 나옵니다.

, 당신은 속성에 대한 어쩌면 조금 유니폼에 대해 알고 있습니다, 당신은 활성화하고 쉐이더를 전환하는 방법 의 괜찮은 이해해야합니다, 당신은 쉐이더 로딩 인프라를 설정해야 차원 GUI 마친 쉐이더 스테이지간에 데이터를 전달하는 방법을 알 수 있습니다. 그런 다음 다른 것을 선택하고 주석을 제거한 다음 반복하십시오. 기초 작업을 이미 완료 했으므로 이번에는 조금 더 빨라질 것입니다. 이 첫 번째 단계가 완료 될 때까지 반복하여 을 완료하십시오.

이제 객체를 버퍼링하기 위해 포팅을 시작할 수 있습니다. 동일한 시간에 너무 많은 GL_VERSION을 뛰어 넘지 않으려면 다시 이 될 것이므로 고정 된 정점 속성 (glVertexPointer, glTexCoordPointer 등)을 고수하십시오. 드로잉 루틴을 수행하고 은 정점 데이터를 프레임 간에서 을 변경하지 않는 데이터와 데이터를 두 개의 주요 그룹으로 나눕니다. 그런 다음 두 번째 그룹 을 자세히 살펴보십시오. 실제로 모든 것이 변경되는 데이터입니까? 예를 들어, 에 키 프레임 애니메이션이있을 수 있으며 항상 데이터를 업데이트하는 대신 버텍스 쉐이더에서 처리 할 수 ​​있습니다. 첫 번째 그룹 으로 다시 이동하십시오. 입자 시스템을 가지고있을 수도 있고 다시 입자 무 변위 위치를 보내고 버텍스 쉐이더에서 간단한 물리 방정식을 적용하여 입자를 처리 할 수 ​​있습니다. 첫 번째 그룹 . 이것이 내가 쉐이더를 먼저 수행하도록 권장 한 이유입니다. 만약 당신이 이 아니라면,이 접근법은 당신에게 유용하지 않았을 것입니다.

절대적으로 변경해야하는 데이터의 경우 약간의 옵션이 있습니다. 직접 모드를 계속 사용하면 GL 2.1을 사용하여 여전히 을 사용할 수 있습니다. 이것을 클라이언트 측 정점 배열로 변환 할 수 있습니다. 일부 버퍼 객체 스트리밍 설정을 살펴볼 수 있습니다.

이 작업을 완료 한 후에 기능적으로 동일한 프로그램을 사용하고 더 이상 고정 파이프 라인을 사용하지 않아야하며 (대부분 일 가능성이 있음) 직접 모드를 더 이상 사용하지 않아야합니다. 그런 다음 결과에 만족한다고 판단하고 임무 수행을 완료했다고 생각하면 GL_VERSION까지 점프해야합니다. 그렇지 않으면 은 추가 기능을 추가하는 것을 선호 할 수 있습니다. 파편 당 으로 이동하여 더 좋은 품질의 결과를 얻을 수있는 정점 당 작품을 얻었습니다 (조명은 고전적인 예입니다). 조금만 최적화하거나 이든간에.

관련 문제