2012-02-13 4 views
0

OpenGL을 사용하여 투명 BGRA 이미지 (텍스트 오버레이)를 이동하고 회전하려고합니다.OpenGL : 텍스처를 복사하는 동안 알파 채널이 255로 설정된 이유는 무엇입니까?

glViewport(0, 0, iWidth, iHeight); // Reset The Current Viewport 
glEnable(GL_TEXTURE_2D); 

glGenTextures(1, &arTex[0].iName); 
glBindTexture(GL_TEXTURE_2D, arTex[0].iName); 

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 

glTexImage2D(GL_TEXTURE_2D, 0, 4, imf.iWidth, imf.iHeight, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ib.GetData()); 

glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Note: Transparent alpha value 
glClear(GL_COLOR_BUFFER_BIT); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glOrtho(-dAspectCanvas/2.0, dAspectCanvas/2.0, -0.5, 0.5, -1.0, 1.0); // Note: Using (-1.0; 1.0) for Z-planes 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glScaled(Motion.Scale.GetValue(dPosition), Motion.Scale.GetValue(dPosition), 1.0); 
glTranslated(Motion.OffsetX.GetValue(dPosition) * dAspectCanvas, Motion.OffsetY.GetValue(dPosition), 0.0); 
glRotated(Motion.Rotation.GetValue(dPosition), 0.0, 0.0, 1.0); 
glTranslated(Motion.PositionX.GetValue(dPosition) * dAspectCanvas, Motion.PositionY.GetValue(dPosition), 1.0); 

// Rotating and moving 

glBindTexture(GL_TEXTURE_2D, arTex[iTexIndex].iName); // has to be called outside glBegin/glEnd scope 

glBegin(GL_TRIANGLE_STRIP); // "Many OpenGL applications avoid quads altogether because of their inherent rasterization problems" 

glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.top); 
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.top); 
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.top); 
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.top); 
glTexCoord2d(rcTextureIntersection.left, rcTextureIntersection.bottom); 
glVertex2d(rcVertexIntersection.left, rcVertexIntersection.bottom); 
glTexCoord2d(rcTextureIntersection.right, rcTextureIntersection.bottom); 
glVertex2d(rcVertexIntersection.right, rcVertexIntersection.bottom); 
glEnd(); 

glDisable(GL_TEXTURE_2D); 
glFlush(); 
glReadBuffer(GL_BACK); 
glReadPixels(0, 0, imf.iWidth, imf.iHeight, GL_BGRA_EXT, GL_UNSIGNED_BYTE, ibOut.GetData()); 

을하지만 glTexImage2D에 시도 무엇이든, 내 투명 블랙 이미지는 완전히 불투명 한 검정색 이미지가됩니다 : 여기가 코드를 사용한다. 입력 BGRA 이미지는 0, 0, 0, 0, 0 바이트를 포함합니다. 회전 후 출력 이미지는 0, 0, 0, 255, 0, 0, 0, 255, 0을 포함합니다 .... A는 항상 255로 설정되어 있으며 이유를 이해할 수 없습니다.

+0

"회전 후 출력 이미지에 0, 0, 0, 255, 0, 0, 0, 255, 0 ...."OpenGL 컨텍스트를 만들 때 프레임 버퍼에 알파 그 안에? –

답변

0

알파는 "투명 함"을 의미하지 않습니다. 알파 자체는 을 의미하지 않습니다.. 그 값을 사용하여 무언가를 할 때만 의미를 얻습니다.

개체를 렌더링하고 해당 개체의 투명도를 제어하기 위해 알파를 사용하려면 블렌딩 및 set up a proper blend mode을 활성화해야합니다.

+0

다음 줄을 사용하여 블렌딩을 시작할 수 있습니까? glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); – Kirill

+0

@ user1207865 : 글쎄, 그 페이지를 읽고 그 라인이 실제로 무엇을하는지 이해할 수 있기를 바랍니다. –

0

여기에는 두 가지 문제가 있습니다. 하나는 텍스처의 알파 값이 투명성에 아무런 영향을 미치지 않는다는 블렌딩을 활성화하지 않았다는 것입니다.

프레임 버퍼 (텍스처를 그리는 곳)에 알파 채널이 없으므로 기본값이 최대 값으로 설정되는 것이 더 중요합니다. 텍스처가 프레임 버퍼 알파 값에 영향을주기 위해 블렌딩을 활성화 할 필요는 없습니다 (그냥 대체 할 것입니다). 그러나이 작업을하려면 알파 채널이있는 프레임 버퍼가 필요합니다. 화면상의 프레임 버퍼에 알파 버퍼를 가져 오는 것은 가능합니다 (그리고 나는 그것을 권장합니다). 그러나 이미지 조작의 경우 프레임 버퍼는 잘못된 위치에 불과합니다. 당신은 이것을 위해 안전한 환경을 원합니다 : A 프레임 버퍼 객체.

0

아무 것도 블렌드 할 필요는 없지만 프레임 버퍼는 알파 비트를 사용하여 설정해야합니다. 그게 문제 였어. 나는 wglCreateContext를 완전히 잊었다.

도움 주셔서 감사합니다.

0

glClearColor를 올바른 알파 색상으로 설정하십시오.

관련 문제