OpenGL ES 2.0 とカスタム フラグメント シェーダーを使用する複数の OpenGL-ES ビューを備えた iPad アプリがあります。現在、シェーダーは個々の OpenGL ビューごとにコンパイルおよびリンクされます。シェーダーを一度コンパイルしてリンクし、ビューごとに再利用したいと思います。理論的には、これは電話をかけるだけの問題です
gluseProgram(gProgramHandle);
私の render() メソッドで、レンダリングの前に gProgramHandle を 1 回読み込みますよね? しかし、これはうまくいきません。単一の gProgramHandle (初期化時に -1 に設定) の使用に切り替えると、1 つの OpenGL ビューのみが機能し、他のビューは濃い緑色の四角形として表示されます。私は何を間違っていますか?
- (void)loadShaders
{
if (gProgramHandle == -1)
{
NSLog(@"Compiling shaders...");
GLuint vertexShader = [self compileShader:@"AIMGsiVertexShader" withType:GL_VERTEX_SHADER];
GLuint fragmentShader = [self compileShader:@"AIMGsiFragmentShader" withType:GL_FRAGMENT_SHADER];
gProgramHandle = glCreateProgram();
glAttachShader(gProgramHandle, vertexShader);
glAttachShader(gProgramHandle, fragmentShader);
glLinkProgram(gProgramHandle);
GLint linkSuccess;
glGetProgramiv(gProgramHandle, GL_LINK_STATUS, &linkSuccess);
if (linkSuccess == GL_FALSE)
{
// If there was an error when compiling the gsls shaders, report the compile error and quit.
GLchar messages[256];
glGetProgramInfoLog(gProgramHandle, sizeof(messages), 0, &messages[0]);
NSString *messageString = [NSString stringWithUTF8String:messages];
NSLog(@"%@", messageString);
exit(1);
}
NSLog(@"Done compiling and linking shaders.");
}
// We can efficiently switch between shaders by calling glUseProgram() to use the program with the shaders we want to use.
glUseProgram(gProgramHandle);
// Gradient map values are sent in this vector: numValuesInCache, factor, offset
_gradientValsUniform = glGetUniformLocation(gProgramHandle, "GradientVals");
_numColorsInGradient = glGetUniformLocation(gProgramHandle, "NumColorsInCache");
_gradientColorsArray = glGetUniformLocation(gProgramHandle, "ColorsArray");
_positionSlot = glGetAttribLocation(gProgramHandle, "Position");
glEnableVertexAttribArray(_positionSlot);
_projectionUniform = glGetUniformLocation(gProgramHandle, "Projection");
_modelViewUniform = glGetUniformLocation(gProgramHandle, "Modelview");
_texCoordSlot = glGetAttribLocation(gProgramHandle, "TexCoordIn");
glEnableVertexAttribArray(_texCoordSlot);
_textureUniform = glGetUniformLocation(gProgramHandle, "Texture");
}