Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题

Posted

技术标签:

【中文标题】Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题【英文标题】:Opengl ES 2.0 - Problem with color opacity by glDrawElements(GL_TRIANGLES) 【发布时间】:2019-12-30 17:47:32 【问题描述】:

我在 opengl es 2.0 中创建了用于绘制正方形的简单 c++ 类。它将正方形放在具有特定颜色和不透明度的特定位置。一切都很好,除了不透明度。我用函数“setColor”设置颜色和不透明度。我希望 0.0f 完全透明和 1.0 完全可见。看起来,对于黑色它可以工作,但白色仍然完全可见,不管我设置什么不透明度。其他颜色的不透明度也很奇怪。

一开始我设置

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_BLEND);

我的班级:

GLSquare::GLSquare() 
    vecs = new std::vector<GLfloat>();
    indices = new std::vector<GLshort>();
    colors = new std::vector<GLfloat>();
    indicesCount = 6;

    for (int i = 0; i < 12; i++) 
        vecs->push_back(0.0f);
    

    for (int i=0; i<16; i+=4) 
        colors->push_back(0.0f);
        colors->push_back(0.0f);
        colors->push_back(0.0f);
        colors->push_back(1.0f);
    

    GLshort ind[] =  0, 1, 2, 0, 2, 3 ;
    for (int i = 0; i < indicesCount; i++) 
        indices->push_back(ind[i]);
    


GLSquare::~GLSquare() 
    delete vecs;
    delete colors;
    delete indices;


void GLSquare::draw(Matrix *matrix) 
    glUseProgram(program->id);

    glEnableVertexAttribArray(program->positionHandle);

    glVertexAttribPointer(program->positionHandle, 3, GL_FLOAT, false, 12, &vecs->front());

    glEnableVertexAttribArray(program->colorHandle);

    // Prepare the background coordinate data
    glVertexAttribPointer(program->colorHandle, 4, GL_FLOAT, false, 0, &colors->front());

    glUniformMatrix4fv(program->matrixHandle, 1, false, matrix->projectionAndView);
    glDrawElements(GL_TRIANGLES, indicesCount, GL_UNSIGNED_SHORT, &indices->front());

    glDisableVertexAttribArray(program->positionHandle);
    glDisableVertexAttribArray(program->colorHandle);


void GLSquare::set(float left, float top, float width, float height) 
    position[0] = left;
    position[1] = top;
    size[0] = width;
    size[1] = height;

    vecs->at(0) = left;
    vecs->at(1) = top;

    vecs->at(3) = left;
    vecs->at(4) = top + height;

    vecs->at(6) = left + width;
    vecs->at(7) = top + height;

    vecs->at(9) = left + width;
    vecs->at(10) = top;


void GLSquare::setColor(Color color, GLfloat opacity) 
    for (int i=0; i<16; i+=4) 
        colors->at(i) = color.r;
        colors->at(i + 1) = color.g;
        colors->at(i + 2) = color.b;
        colors->at(i + 3) = opacity;
    

我的片段着色器很简单:

precision mediump float; 

varying vec4 v_Color;

void main() 
 
    gl_FragColor = v_Color;

我的顶点着色器:

uniform   mat4 uMVPMatrix;

attribute vec4 vPosition;
attribute vec4 a_Color;

varying vec4 v_Color;

void main() 
 
   gl_Position = uMVPMatrix * vPosition;
   v_Color = a_Color;

从着色器获取颜色句柄:

program->colorHandle = glGetAttribLocation(programID, "a_Color");

下面是它的外观:

square->setColor(Color(1.0f,1.0f,1.0f), 0.1f);

左上角的白色矩形

这里是黑色,不透明度0.1

【问题讨论】:

背景是白色的吗? 嗨,我添加了图片。我添加了不透明度为 0.1 的白色和黑色 您的代码还有很大的改进空间。一旦它正常工作,请考虑将其发布到codereview.stackexchange.com。 我发现了问题。代码正常工作,其他 3rd 方库覆盖 glBlendFunc。修复它解决了这个问题。 【参考方案1】:

我发现了问题。代码正常工作,其他 3rd 方库覆盖 glBlendFunc。修复它解决了问题

【讨论】:

以上是关于Opengl ES 2.0 - glDrawElements(GL_TRIANGLES)的颜色不透明度问题的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL ES:一个 VBO 中的多个网格

OPENGL ES 2.0 知识串讲――OPENGL ES 2.0 概括

OpenGL:glDrawElements 不绘制

OPENGL ES 3.1是否比OPENGL ES 2.0慢?

如何在Android上使用OpenGL ES 2.0绘制点

如何在Android上将OpenGL ES 1.0代码转换为OpenGL Es 2.0?