2015-01-21 4 views
0

현재 OpenGL을 배우려고하고 있는데 텍스처 투명도 문제가 있습니다.Qt OpenGL - 텍스처 투명도 문제

두 개의 평면/사각형이 질감이 있습니다. 첫 번째는 카메라에 가장 가깝고 두 번째는 첫 번째 것보다 뒤에 있습니다. 둘 다 50 % 불투명도의 배경을 가진 이미지로 텍스처되어 있습니다.

첫 번째 평면이 어느 정도 투명하기 때문에 두 번째 평면의 질감을 볼 수 있어야합니다. 그러나 그렇지 않습니다. 내가 사용하고있는 이미지는 실제로 (카메라를 회전하면 볼 수 있습니다.) 그들 자신의 이미지로 나타납니다. 그리고 그들에게 단어가 있습니다 (이미지의 반투명 배경을 통해 나는 피를 흘릴 것으로 예상됩니다).).

해결 방법이 있습니까? 여기에 내 초기화 및 paintGL 방법 (아마도 그들은 무섭게 최적화)이다

void oglWidget::initializeGL() 
{ 
    glEnable(GL_DEPTH_TEST); 
    glEnable(GL_BLEND); 
    glEnable(GL_CULL_FACE); 

    qglClearColor(QColor(Qt::white)); 

    shaderProgram.addShaderFromSourceFile(QGLShader::Vertex, ":/vertexShader.vsh"); 
    shaderProgram.addShaderFromSourceFile(QGLShader::Fragment, ":/fragmentShader.fsh"); 
    shaderProgram.link(); 

    // vertices[1] << QVector3D(-xAmt, -1, 0) << QVector3D(xAmt, -1, 0) << QVector3D(xAmt, 1, 0) // Front 
    //   << QVector3D(xAmt, 1, 0) << QVector3D(-xAmt, 1, 0) << QVector3D(-xAmt, -1, 0); 

    float xAmt = 16.00/9.00; 
    vertices << QVector3D(-xAmt, -1, 0) << QVector3D(xAmt, -1, 0) << QVector3D(xAmt, 1, 0) // Midground 
      /*<< QVector3D(xAmt, 1, 0) << QVector3D(-xAmt, 1, 0) << QVector3D(-xAmt, -1, 0)*/ 
      << QVector3D(-xAmt, -1, -1) << QVector3D(xAmt, -1, -1) << QVector3D(xAmt, 1, -1) // Background 
      << QVector3D(xAmt, 1, -1) << QVector3D(-xAmt, 1, -1) << QVector3D(-xAmt, -1, -1); 


    textureCoordinates << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Front 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0) 
         << QVector2D(0, 0) << QVector2D(1, 0) << QVector2D(1, 1) // Front 
         << QVector2D(1, 1) << QVector2D(0, 1) << QVector2D(0, 0); 
} 

void oglWidget::paintGL() 
{ 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    QMatrix4x4 mMatrix; 
    QMatrix4x4 vMatrix; 

    QMatrix4x4 cameraTransformation; 
    cameraTransformation.rotate(alpha, 0, 1, 0); 
    cameraTransformation.rotate(beta, 1, 0, 0); 

    QVector3D cameraPosition = cameraTransformation * QVector3D(0, 0, distance); 
    QVector3D cameraUpDirection = cameraTransformation * QVector3D(0, 1, 0); 

    vMatrix.lookAt(cameraPosition, QVector3D(0, 0, 0), cameraUpDirection); 
    shaderProgram.bind(); 
    shaderProgram.setUniformValue("mvpMatrix", pMatrix * vMatrix * mMatrix); 


    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); 
    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    shaderProgram.setUniformValue("texture", 0); 
    shaderProgram.setAttributeArray("vertex", vertices.constData()); 
    shaderProgram.enableAttributeArray("vertex"); 
    shaderProgram.setAttributeArray("textureCoordinate", textureCoordinates.constData()); 
    shaderProgram.enableAttributeArray("textureCoordinate"); 
    glGenTextures(0, &texture); glBindTexture(GL_TEXTURE_2D, texture); 

    QImage tempTexture = QGLWidget::convertToGLFormat(QImage(ImgManager::getImg("/Textures/Editor/m.png"))); 
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, tempTexture.width(), tempTexture.height(), 0, GL_RGBA, GL_UNSIGNED_BYTE, tempTexture.bits()); 
    glDrawArrays(GL_TRIANGLES, 0, vertices.size()); 

    shaderProgram.release(); 
} 
+1

깊이 테스트를 비활성화하거나 깊이 마스크를 설정해보십시오. – dari

+0

네, 그게 문제였습니다. 원한다면 의견 대신 대답으로 회신 해주십시오. 불편을 확인하고 동의하십시오. – Yattabyte

답변

3

혼합은 현재의 단편 표시되고가 깊이 버퍼를 채울 수 있는지 확인하는 깊이 테스트를 수행하는 새로운 형상을 사용할지라도 새로운 가치.

간단한 방법은 glDisable(GL_DEPTH_TEST);와 completly 깊이 테스트를 비활성화하는 것입니다 수정,하지만 더 나은 방법은 다음과 같다 :

  1. glDepthMask(GL_TRUE);
  2. glDepthMask(GL_FALSE);
  3. 그리기를 설정 불투명 objekts 그리기 설정 투명한 대상물

glDepthMask(GL_FALSE);은 깊이 테스트 자체가 여전히 활성화되어있는 동안 깊이 버퍼에 쓰는 것을 비활성화합니다. 결과적으로 불투명 한 객체는 투명한 객체가 실제로 그 앞에있는 경우에만 차단합니다.