2013-10-02 7 views
1

Я пытаюсь изменить прозрачность текстуры, нарисованной на квадрат, код ниже отлично работает, за исключением того, что альфа-набор с 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); 

+0

Да, это в основном то, что я подразумевал. Хотя у вас действительно есть два варианта при выполнении этого, вы можете использовать униформу в вершинном шейдере и установить переменную для перехода к шейдеру фрагментов (это эффективно, как конвейер с фиксированной функцией работает с 'glColor (...)'). Использование униформы в шейдере фрагмента гораздо более прямолинейно, тем более, что, когда вы думаете об этом, значение альфа ** равномерно **, поэтому нет смысла использовать интерполяцию per-vertex. –

ответ

0

вы, очевидно, с помощью OpenGL ES 2.0 (потому что вы используете glVertexAttribPointer и glUniformMatrix4fv), который на самом деле делает это немного озадачивает. OpenGL ES 2.0 не определяет glColor<N> (...), это было частью API фиксированной функции и не должно быть определено в совместимой реализации OpenGL ES 2.0.

Даже если это определено, в GLSL ES нет механизма для получения «текущего цвета» в шейдере. Desktop GL имеет предварительно объявленную переменную gl_Color в профилях совместимости GLSL, но GLSL ES этого не делает.

Вам нужно будет использовать форму GLSL, если вы хотите определить цвет таким образом, вместо использования атрибута per-vertex.

+0

отлично, спасибо - любые указатели на то, как я буду использовать форму GLSL для достижения этой цели? – jonydep

Смежные вопросы