OpenGL에서 텍스처를 투명하게 만드는 방법은 무엇입니까?
문제
나는 이것을 Google에서 조사하려고 노력했지만 일관된 간단한 답변이있는 것으로 보이지 않습니다. 이것은 단순하지 않거나 올바른 키워드를 사용하지 않기 때문입니까?
그럼에도 불구하고, 이것은 내가 지금까지했던 진전입니다.
- 2 사각형을 형성하기 위해 8 개의 정점을 만들었습니다.
- 200 비트 알파 값으로 텍스처를 만들었습니다 (따라서 약 80% 투명).
- 각 정사각형에 동일한 텍스처를 할당하여 올바르게 표시됩니다.
- 255 알파의 질감을 사용하면 더 밝게 보입니다.
Init는 다음과 같습니다.
glClearColor(0.0, 0.0, 0.0, 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glGenTextures(1, textureIds);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
int i, j;
GLubyte pixel;
for (i = 0; i < TEXTURE_HEIGHT; i++)
{
for (j = 0; j < TEXTURE_WIDTH; j++)
{
pixel = ((((i & 0x8) == 0) ^ ((j & 0x8) == 0)) * 255);
texture[i][j][0] = pixel;
texture[i][j][1] = pixel;
texture[i][j][2] = pixel;
texture[i][j][3] = 200;
}
}
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA,
TEXTURE_WIDTH, TEXTURE_HEIGHT,
0, GL_RGBA, GL_UNSIGNED_BYTE, texture);
이것은 책의 417 페이지의 코드 스 니펫과 다소 유사합니다. OpenGL 프로그래밍 안내서, 확인 패턴을 만듭니다.
그리고 디스플레이 기능에는 ...
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_TEXTURE_2D);
// Use model view so that rotation value is literal, not added.
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
// ... translation, etc ...
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, +1.0, 0.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.0, -1.0, 0.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.0, +1.0, 0.0); // top right
glEnd();
// not neccecary to repeat, just good practice
glBindTexture(GL_TEXTURE_2D, textureIds[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0, 0.0); glVertex3f(-0.5, +1.0, -1.0); // top left
glTexCoord2f(0.0, 1.0); glVertex3f(-0.5, -1.0, -1.0); // bottom left
glTexCoord2f(1.0, 1.0); glVertex3f(+1.5, -1.0, -1.0); // bottom right
glTexCoord2f(1.0, 0.0); glVertex3f(+1.5, +1.0, -1.0); // top right
glEnd();
glFlush();
glDisable(GL_TEXTURE_2D);
glPopMatrix();
SwapBuffers();
따라서 이것은 백그라운드에서 2 차 광장을 렌더링합니다. 나는 이것을 볼 수 있지만, 그들은 배경과 혼합되는 것처럼 보인다 (나는 255 비트보다 200 비트 알파로 더 어둡기 때문에 이것을 가정한다).
보시다시피, 투명성은 없습니다 ... 어떻게 해결할 수 있습니까?
해결책
따라서 여기에 있었지만 삭제 된 다른 대답은 이것을 언급했습니다. 일반적으로 알파 블렌딩이 올바르게 작동하기 위해서는 카메라의 좌표계에서 객체를 멀리서 근처로 정렬해야합니다.
이것이 당신의 다각형이 배경과 혼합되는 이유입니다. 깊이 테스트를 비활성화하여 이것이 실제로 문제임을 확인할 수 있습니다. 깊이 테스트없이 모든 조각이 표시되며 알파 블렌딩을 볼 수 있습니다.
이것에 대해 더 이 페이지.
제휴하지 않습니다 StackOverflow