В моята програма OpenGL ES 2.0 на iOS компилирам своите шейдъри, както следва:
setShaderState(state);//enables or disables GL_BLEND
GLuint vertexShader = compileShaderPart(vertexShader, GL_VERTEX_SHADER, state);
GLuint fragmentShader = compileShaderPart(fragmentShader, GL_FRAGMENT_SHADER, state);
//linking
GLuint programHandle = glCreateProgram();
Assert(programHandle != 0, "Program handle 0");
for(auto shaderAttribute : shaderAttributeList){
if(isVertexAttribute(shaderAttribute.attribute())){
glBindAttribLocation(programHandle, shaderAttribute.attribute(), shaderAttribute.attributeName(1).c_str());
}
}
glAttachShader(programHandle, vertexShader);
glAttachShader(programHandle, fragmentShader);
glLinkProgram(programHandle);
Assert(glGetError() == GL_NO_ERROR, "Could not link program");
GLint linkSuccess;
glGetProgramiv(programHandle, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE) {
GLchar messages[256];
glGetProgramInfoLog(programHandle, sizeof(messages), 0, &messages[0]);
ELog << messages;
Assert(0, "Error compiling shader");
}
ShaderUniformHandleMap shaderUniformMap;
Shader *shader = new Shader(programHandle, availableShader.name, shaderUniformMap, state);
glUseProgram(programHandle);
auto mesh = Mesh::load("quad");
shader->bindMesh(mesh);
auto temp_texture = Texture2D::load("checker");
for(auto uniform : shader->texture){
glUniform1i(uniform.handle, shader->bindTexture(temp_texture->textureId()));
}
glDrawElements(GL_TRIANGLES, mesh->indexDataSize(), GL_UNSIGNED_SHORT, 0);
Оставих унифицираната част за четене за четливост и функцията compileShaderPart е възможно най-права.
Изпълнението на приложението в openGL ES Analyzer в инструменти води до стотици случаи на проблема „Шейдърът е компилиран извън фаза на предварително загряване“. Не трябва ли извикването glDrawElements да се погрижи за това?
Чел съм, че промяната на състояния като GL_Blend може да има това въздействие, така че компилирам един и същ шейдър два пъти, веднъж с активиран GL_Blend и веднъж деактивиран, но това нямаше значение.
Какъв е проблемът тук? Също така ми е трудно да намеря информация за тези неща за предварително загряване, досега разбрах, че шейдърът се компилира наистина след първото извикване на теглене, поради което накрая рисувам това четворно.