2011-12-15 6 views
4

FTGL 글꼴 라이브러리로 작업하여 텍스처 매핑 글꼴을 만들고 화면에 렌더링하려고합니다. 라이브러리는 GL_ALPHA 형식의 텍스쳐를 만들어서 글꼴 글립 문자를 저장하고, 문자열을 렌더링하라는 명령을 내리면 glBegin(GL_QUADS)을 통해 각 글립 문자를 정확하게 렌더링합니다.GL_ALPHA 텍스처를 어떻게 렌더링합니까?

문제는 텍스트가 없습니다. 한 시나리오에서, 나는 텍스트 대신 단색의 검은 박스를 얻었고, 다른 하나는 아무것도 얻지 못했다. gDEBugger에서 코드를 실행하여 텍스처가 업로드되고 올바르게 설정되도록하고 모든 것이 올바르게 보이지만 여전히 출력이 표시되지 않습니다.

나는 명백한 것을 시도했다. 텍스트 색상을 설정하려고 사전에 glColor을 호출하면 아무 효과가 없습니다. 어느 쪽과 같이 제대로 작동 할 수 알파 블렌딩을 보장하기 위해 시도하지 않습니다

glEnable(GL_ALPHA_TEST); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

사람이 내가 화면에 GL_ALPHA 질감에서 렌더링 할 제대로 보여주기 위해, 누락 어떤 생각을 가지고 있습니까?

+0

"라이브러리는 GL_ALPHA 형식의 텍스쳐를 만들어서 글꼴 글리프"Really? 사용할 형식을 선택할 수 없습니까? 그것은 GL 3.1 코어 이상 GL_ALPHA 텍스처가 더 이상 없기 때문에 그럴 수 없다면 불행한 일입니다. –

+0

@ 니콜 : 예, 정말로, 그래서 뭐? 나는 드라이버가 코어를 구현하고 역 호환성을 무시하는 비디오 카드를 전혀 모르고있다. 그건 정말 바보 같은 행동 일 것이고 제조사들은 그것을 알고 있습니다. –

+0

MacOSX 10.7은 호환성을 구현하지 않습니다. 2.1 또는 3.2 * core * 중에서 선택할 수 있습니다. 제거 된 항목에 의존한다는 사실을 무시하더라도 사용자가 원하는 형식에 대한 몇 가지 옵션을 제공해야합니다. 그들은 GL_ALPHA를 사용하기 때문에 텍스쳐 환경과 색상 (아래 참조)을 사용하기 위해 많은 노력을 기울여야합니다. 대부분의 사람들처럼 GL_INTENSITY를 사용했다면 GL_MODULATE와'GL_ONE','GL_ONE_MINUS_SRC_ALPHA'의 혼합 모드를 사용할 수 있습니다. –

답변

3

FTGL의 코드를 살펴본 후 API가 텍스트 렌더링 자체를 수행하도록 고안된 것은 확실합니다. OpenGL 호출을 내부적으로 호출하는 렌더링 함수를 호출해야합니다.

다른 말로하면 FTGL은 텍스처에 글꼴을로드 한 다음 해당 텍스처 개체를 제공하고 사용자가 직접 글리프를 그릴 수 있도록 설계되지 않았습니다. 그렇다고해서 이 될 수 없다는 것을 의미하지는 않습니다. API가 도움이되지 않습니다.

검은 색으로 표시되는 이유는 GL_ALPHA 텍스처가 액세스 될 때 RGB 구성 요소에 대해 0을 반환하기 때문입니다. 텍스처 환경에서 GL_MODULATE을 사용하기 때문에 색상의 RGB 부분에 0이 곱해집니다.

의도 한대로하려면 GL_MODULATE 대신 GL_TEXTURE_ENV_MODEGL_COMBINE으로 설정해야합니다. 즉, 간단하지 않은 combine environment mode을 사용해야합니다. 그들이 존재하자마자 셰이더를위한 고정 함수를 거의 버렸기 때문에, 나는 오랫동안 결합자를 건드리지 않았다. 그래서 소금물로 뒤 따르십시오.

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR); 

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE); 
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE); 
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA); 

은 무엇 당신이 원하는 것은 RGB 부분이 glColor에서오고 알파 부분은 질감에서 오는 색상을 생성 할 수 있습니다 : 여기에 환경 코드가 어떻게 보일지에서 추측이다. 이것이 당신이하는 방법입니다.

영어로, 첫 번째 줄에는 질감 환경 모드가 "결합"으로되어있어보다 복잡한 작동 모드가 활성화됩니다. 다음 세 줄은 색상의 RGB 부분이 생성되는 방법을 지정합니다. GL_COMBINE_RGBGL_REPLACE으로 설정하면 소스 RGB 값 0은 출력 RGB가됩니다. GL_SRC0_RGB에서 GL_PRIMARY_COLOR으로 설정하면 소스 RGB 값 0이 기본 색상입니다. 즉, 정점 처리에 의해 생성 된 색상입니다 (즉, 조명을 사용하지 않는 한 이것은 glColor으로 전달한 것입니다). GL_OPERAND0_RGBGL_SRC_COLOR으로 설정하면 색상을 그대로 유지할 수 있습니다 (수행 할 수있는 특별한 작업이 있습니다 (예 : 1 - the color 또는 무엇이든).

다음 세 줄은 출력 색상의 알파 부분이 나오는 곳으로 설정됩니다.GL_COMBINE_ALPHAGL_REPLACE으로 설정되면 소스 알파 값 0 (소스 RGB 값 0과 다름)은 출력 알파가됩니다. GL_SRC0_ALPHAGL_TEXTURE으로 설정하면 원본 알파 값 0이 현재 텍스처 단위의 텍스처에서 비롯된 것입니다. GL_OPERAND0_ALPHAGL_SRC_ALPHA으로 설정하는 것은 알파를 그대로 사용하는 것을 의미합니다 (이전과 같이 여기에 알파를 적용 할 수 있습니다).

OpenGL 구현에서 ARB_texture_swizzle을 사용할 수있는 경우 스위 즐 마스크를 설정하여 GL_ALPHA 형식을 GL_INTENSITY으로 효과적으로 변환 할 수 있습니다. 그런 다음 GL_TEXTURE_ENV_MODE으로 GL_MODULATE을 사용할 수 있습니다. 그러나 혼합 모드가 glBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)인지 확인해야합니다. GL_MODULATE은 알파를 색상에 곱하기 때문에이 작업이 필요합니다. GL_ONE 대신 GL_SRC_ALPHA을 사용한 경우 알파 번을 번 두 번 (텍스처 env 단계에서 한 번, 혼합 단계에서 한 번) 수행합니다.

+0

I * am * 렌더링 함수를 호출하고 OpenGL 호출을 내부적으로 호출하도록합니다. 그것은 단지 일을 올바르게 렌더링하지 못합니다. 지난 밤에 몇 시간을 보냈고 오늘 아침에 코드 (좋은 경험이 아니 어서 C++ 사람이 아닙니다!)에서 텍스처를 만들려고 노력했습니다. 가장자리 케이스가 있기 때문에 텍스처를 올바르게 만들려고했습니다. 제대로 처리하지 못합니다. 렌더링을 쉐이더 기반 코드로 옮길 계획을 가지고 있습니다 만, 먼저 라이브러리가 고정 함수를 위해 디자인 되었기 때문에 그것이 고정 함수에서 제대로 작동하는지 확인하고 싶습니다. 그리고 그것은 나에게 온전한 체크를줍니다. –

관련 문제