У меня очень простой шейдер (просто устанавливает фоновый квадрат на зеленый), и это прекрасно работает.
Недавно я добавил несколько квадов, к которым применена текстура. Эта текстура имеет некоторые альфа-значения, поэтому я использую ее для вызова:
glEnable (GL_BLEND);
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, textureID);
//draw quad
glDisable(GL_TEXTURE_2D);
glBlendFunc (GL_ONE, GL_ZERO);
glDisable (GL_BLEND);
glBindTexture(GL_TEXTURE_2D, 0); //remove texture
Четверка хорошо отображается с прозрачностью - но шейдер на заднем плане теперь исчез. Он все еще рисуется, но не отображается.
Теперь я удалил обе строки glBlendFunc (...), и шейдер снова появляется (но я теряю альфа-смешение).
Однако всякий раз, когда я вызываю эту функцию, шейдер, кажется, просто перестает работать.
Есть идеи, почему это может происходить?
Изображение с удаленным glBlendFunc:
![glBlendFunc](https://i.imgur.com/dMnVY.png)
Изображение с использованным glBlendFunc:
Код загрузки шейдера:
//create shaders
vertexShader = glCreateShader(GL_VERTEX_SHADER);
fragmentShader = glCreateShader(GL_FRAGMENT_SHADER);
//grab the char so we can send it to gfx card
const char* vShadData = loadFile(vertexShaderFile);
const char* fShadData = loadFile(fragShaderFile);
//send data to gfx card
glShaderSource(vertexShader, 1, (const GLchar **)&vShadData, NULL);
glShaderSource(fragmentShader, 1, (const GLchar **)&fShadData, NULL);
//check if compiled
GLint compiled;
glCompileShader(vertexShader);
glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &compiled);
if(compiled==FALSE)
{
//doesn't get here
}
glCompileShader(fragmentShader);
glGetShaderiv(fragmentShader, GL_COMPILE_STATUS, &compiled);
if(compiled==FALSE)
{
//doesn't get here
}
//finally, create shader program
shaderProgram = glCreateProgram();
//attach shaders to program
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
GLint linkStatus;
glGetProgramiv(shaderProgram, GL_LINK_STATUS, (GLint *)&linkStatus);
if(linkStatus==FALSE)
{
//doesn't get here
}
Vert Shader (очень просто):
void main(void)
{
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
}
Frag Shader:
void main(void)
{
gl_FragColor = vec4(0.0, 0.3, 0.0, 0.0);
}