Я пытаюсь изменить прозрачность текстуры, нарисованной на квадрат, код ниже отлично работает, за исключением того, что альфа-набор с glColor4f не влияет. Каковы возможные причины этого? Возможно, это будет установка gl в другом месте программы?alpha blending in opengl es не работает
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_COLOR, GL_ONE_MINUS_SRC_ALPHA);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureId);
glColor4f(1.0f, 1.0f, 1.0f, 0.3f);
glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0, quadVertices);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0, quadNormals);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0, quadTexCoords);
glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE, (GLfloat*)&modelViewProjectionButton.data[0]);
glDrawElements(GL_TRIANGLES, NUM_QUAD_INDEX, GL_UNSIGNED_SHORT, quadIndices);
glDisableVertexAttribArray(vertexHandle);
glDisableVertexAttribArray(normalHandle);
glDisableVertexAttribArray(textureCoordHandle);
Edit: мне удалось сделать это в соответствии с приведенной ниже ответ. Если кто-то заинтересован, я поставил единую переменную в моем шейдер, называемый альфа, например:
uniform float alpha;
void main()
{
gl_FragColor = texture2D(texSampler2D, texCoord);
gl_FragColor = gl_FragColor * alpha;
}
, а затем, когда я рисую сцену я использовал его, как это (например, установить 0.5 альфа):
GLint alphaLocation = glGetUniformLocation(shaderProgramID, "alpha");
glUniform1f(alphaLocation, 0.5);
Да, это в основном то, что я подразумевал. Хотя у вас действительно есть два варианта при выполнении этого, вы можете использовать униформу в вершинном шейдере и установить переменную для перехода к шейдеру фрагментов (это эффективно, как конвейер с фиксированной функцией работает с 'glColor (...)'). Использование униформы в шейдере фрагмента гораздо более прямолинейно, тем более, что, когда вы думаете об этом, значение альфа ** равномерно **, поэтому нет смысла использовать интерполяцию per-vertex. –