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 2.0 知识串讲――OPENGL ES 2.0 概括