2013-07-16 128 views
0

试图找出为什么我的程序没有附加着色器。我遇到了另一个问题。我的片段和顶点着色器都等于零(他们NULL)iOS上的OpenGL ES 2:空片段和顶点着色器

NSString *vertexShaderPath = [[NSBundle mainBundle] pathForResource:@"VertexShader" ofType:@"glsl"]; 
NSString *vertexShaderString = [NSString stringWithContentsOfFile:vertexShaderPath encoding:NSUTF8StringEncoding error:nil]; 
const char * vertexShaderCString = [vertexShaderString cStringUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"%s",vertexShaderCString); 

NSString *fragmentShaderPath = [[NSBundle mainBundle]pathForResource:@"FragmentShader" ofType:@"glsl"]; 
NSString *fragmentShaderString = [NSString stringWithContentsOfFile:fragmentShaderPath encoding:NSUTF8StringEncoding error:nil]; 
const char* fragmentShaderCString = [fragmentShaderString cStringUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"%s", fragmentShaderCString); 

int vertexShaderCStringLength = strlen(vertexShaderCString); 
NSLog(@"%i",vertexShaderCStringLength); 

vertexShader = glCreateShader(GL_VERTEX_SHADER); 
glShaderSource(vertexShader, 1, &vertexShaderCString, &vertexShaderCStringLength); 
glCompileShader(vertexShader); 


int fragmentShaderCStringLength = strlen(fragmentShaderCString); 
NSLog(@"%i",fragmentShaderCStringLength); 

fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); 
glShaderSource(fragmentShader, 1, &fragmentShaderCString, &fragmentShaderCStringLength); 
glCompileShader(fragmentShader); 


programHandle = glCreateProgram(); 
glAttachShader(programHandle, vertexShader); 
glAttachShader(programHandle, fragmentShader); 
glLinkProgram(programHandle); 

glGetProgramiv(programHandle, GL_ATTACHED_SHADERS, &attachedShaders); 
NSLog(@"Attched shaders: %i",attachedShaders); 

if (fragmentShader == 0) { 
    NSLog(@"Some sort of fragment error"); 
} 

if(vertexShader == 0){ 

NSLog(@"Some sort of vertex error"); 
} 

上面的代码处于GLKViewController的viewDidLoad中。之前,我有编码寻找编译错误(为便于阅读,删除) - 这什么都没有,我也是在一个NSLog的印刷出来的片段和Vertex Shader,所以我知道我的路径是正确的。

我不知道为什么我的顶点和片段着色器等于零。我在这个程序上花了很多时间,我不想重新开始。

任何帮助都非常感激!

谢谢!

+0

如果您在使用iOS上的OpenGL ES 2.0和'glCreateShader(GL_VERTEX_SHADER)'将返回零,然后检查是否有适当的设置OpenGL上下文,看看'glGetError()'说。 –

回答

0

如这里看到的 - http://developer.apple.com/library/ios/#documentation/3DDrawing/Conceptual/OpenGLES_ProgrammingGuide/DeterminingOpenGLESCapabilities/DeterminingOpenGLESCapabilities.html#//apple_ref/doc/uid/TP40008793-CH102-SW1

检查扩展使用它们

在编码(着色器文件)ASCII或UTF-8之前?

呼叫glGetError来测试错误

因为你的代码看起来完全正常,尝试调用glGetError(...)代替NSLog(...)找到更多的错误(如果有的话)。

相关问题