簡體   English   中英

Qt OpenGL-紋理透明度問題

[英]Qt OpenGL - Texture Transparency issue

我目前正在嘗試學習OpenGL,但紋理透明度有問題。

我有2個帶紋理的平面/矩形,第一個靠近相機,第二個更靠后,在第一個后面。 兩者均使用背景為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();
}

即使啟用了混合功能,新幾何也將執行深度測試,以檢查當前片段是否可見, 使用新值填充深度緩沖區。

解決該問題的一種簡單方法是使用glDisable(GL_DEPTH_TEST);完全禁用深度測試glDisable(GL_DEPTH_TEST); ,但是更好的方法如下:

  1. 設置glDepthMask(GL_TRUE);
  2. 繪制不透明物體
  3. 設置glDepthMask(GL_FALSE);
  4. 繪制透明對象

glDepthMask(GL_FALSE); 在深度測試本身仍處於啟用狀態時,將禁用對深度緩沖區的寫入。 結果,不透明的對象只有在它們真正位於透明對象的前面時才會遮擋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM