2014-09-11 2 views
1

나는 glAlphaBlend와 그의 모든 매개 변수에 alhpa 마스킹을 사용하려고합니다. stackoverflow 많은 비슷한 대답을 발견하지만 아무것도 실현하지 않습니다.OpenGL Alpha 마스크

배경 (1), 마스크 (2), 텍스트 (3)의 세 가지 이미지가 있습니다.

내가 원하는 것은 배경을 그려야하고, 내 마스크를 텍스트에 가져 와서 마침내 이미지 (A)를 얻는 것입니다.

Image Example

Draw background 

glClearColor(0,0,0,0); 
glClear(GL_COLOR_BUFFER_BIT); 
glClear(GL_DEPTH_BUFFER_BIT); 
glEnable(GL_BLEND); 
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_TRUE); 
glBegin(GL_QUADS); 
glColor4ub(0,0,0,255); 
glVertex2d(mxIncrust0 - bgwidth, myIncrust0); 
glVertex2d(mxIncrust0, myIncrust0); 
glVertex2d(mxIncrust0, myIncrust0 + textheight); 
glVertex2d(mxIncrust0 - bgwidth, myIncrust0 + textheight); 
glEnd(); 
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); 

glEnable(GL_BLEND); 
glBlendEquation(GL_FUNC_ADD); 
glBlendFuncSeparate(GL_ONE_MINUS_DST_ALPHA, GL_DST_ALPHA, GL_ZERO, GL_ONE); 

Draw Text 

그러나 뭐든지 노력하고 있습니다!

실제 구현 방법은 무엇입니까?

+0

'하지만 아무 것도 작동하지 않습니다!'이것은 무엇을 의미 할 수 있습니까? 무슨 결과가 있니? SO에 매체가 없습니다. – Drop

+0

나는 이해하고있다. 나는 모든 대답을 쌓아 봤지만 아무 것도 옳은 일을하고 있다고 말하려고한다. – Maypeur

+0

그럼 우리가 가진 것을 보여주십시오. 또한 "마스크 그리기"와 같은 것은 없습니다. 그릴 수있는 유일한 방법은'Draw *'호출입니다. 가면을 그릴 필요가 없습니다. 출력 합병 단계에서 마스크가 텍스트 텍스처와 결합됩니다 (GL 속어의 "샘플 당 연산"). 드로잉 코드와 결과 스크린 샷을 보여주기 전에 opengl 문서를 살펴 보시기 바랍니다 : [렌더링 파이프 라인 개요] (http://www.opengl.org/wiki/Rendering_Pipeline_Overview) – Drop

답변

1

마침내 해결책을 찾았습니다. glClipPlane에서 텍스처가 아니기 때문에 쉐이더에 대한 해결책을 찾지 못했습니다.

어떻게 작동합니까? 1) 내 배경을 그립니다. (쿼드, 라인 ...) 2) 왼쪽 아래에 아무것도 그려지지 않고 아무 것도 내릴 수 없습니다. 오른쪽 위에는 아무런 제한이 없습니다. 3) 필요한 모든 것을 그립니다. quad, lines, my text ...) 4) 클립을 비활성화합니다.

// Draw the background 
double* leftMask = new double[4]; 
leftMask[0] = 1; 
leftMask[3] = -mClipXL; // Be careful to use -Limit for the left limit 
glClipPlane(GL_CLIP_PLANE0, leftMask); 
delete[] leftMask; 
glEnable(GL_CLIP_PLANE0); 

double* rightMask = new double[4]; 
rightMask[0] = -1; // Be careful to use -1 for the right limit 
rightMask[3] = mClipXR; 
glClipPlane(GL_CLIP_PLANE1, rightMask); 
delete[] rightMask; 
glEnable(GL_CLIP_PLANE1); 

// draw the text 

// disable the clip to draw anything else. 
glDisable(GL_CLIP_PLANE0); 
glDisable(GL_CLIP_PLANE1); 

매우 잘 작동합니다!

7

이것을 달성하는 "실제 방법"은 shader programsmodern OpenGL을 사용하는 것입니다. 왜 그 비난 API를 사용합니까? 우리는 2014 년에 최신 버전으로 OpenGL 4.5를 사용하고 있습니다. 이전의 호환성을 지닌 몇몇 실제의 오래된 카드 (잘 5 년 된)조차도 현재 프로그래밍이 가능한 적어도 GL 3.2를 지원합니다. 그리고 GL 2.0을 사용하더라도 여전히 쉐이더를 사용할 수 있지만 사용되지 않는 API로 작업하면 가까운 장래에 생계를 위해 OpenGL을 코딩하려는 계획이 없다면.

이제 셰이더를 사용하여 마스킹이 가장 간단한 작업 중 하나입니다. 당신은 일반적으로 조각 shader.1에 2 개 텍스처를 통과 할 것 - 질감 미만성 (실제 텍스처 표면을 커버하기 위해) 2 - 마스크 텍스처 (아마도 단일 채널의 회색 음영 질감)

조각 쉐이더는 다음과 같이 보일 것이다 :

#version 150 
uniform sampler2D maskTex; 
uniform sampler2D colorTex; 

out vec4 colorOut; 
in smooth vec2 texCoords; 
void main(){ 

    vec4 color = texture(colorTex,texCoords); 
    vec4 mask = texture(maskTex,texCoords); 

    colorOut =vec4(color.rgb,color.a * mask.r);//alpha value can be in any channel ,depends on texture format. 
} 

간단 할 수 있습니다. 도움이 되길 바랍니다.

피. 확산 텍스처가 밉맵 인 경우 알파 텍스처도 밉맵 처리해야합니다. 내 예제가 특정 작업을 해결하지 못했지만 프로그래밍 가능한 OpenGL에서 기본 마스킹이 수행되는 방법을 보여주기 위해 여기에서부터 무엇을해야할지 쉽게 알 수 있습니다.)

+0

이 답변을 주셔서 감사합니다. shader를 사용하여 similars 예제를 발견했습니다. 그것은 이해할 수있는 것 같지만 내 첫 번째 문제는 텍스쳐가 아니라 기본 gl_quad로 마스크를 생성한다는 것입니다! 추신 : 그것은 내가 찾고 있던 방법을 해결하지 못한다. 그러나 당신이 미래에 대해 더 잘 말하면서 첫 번째 연기자와 두 번째 것으로 보인다. 나는 며칠 동안 그것을 시도 할 것이다 ... – Maypeur