0

我有一个 GLKViewController ,它的实现如下......

#import "game-gl.h"
....
- (void)glkView:(GLKView *)view drawInRect:(CGRect)rect
{
  renderFrameLine();
}

game-gl.c(我从 s = .5 开始)

void renderFrameLine() {
    printf("Inside Render Line \n");
    if(f>1.0f){
        f = 0.0f;
    }
    else{
        f = f+.01;
    }
    glClearColor(f, 0.65f, f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    if(s >2.0f){
        s = -2.0f;
    }
    else{
        s = s + 0.10f;
    }
GLfloat vVertices[] = { s, s, 0.0f, s, -s, 0.0f, -s, s,
    0.0f};
GLfloat colors[] = {
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f,
    1.0f, 0.0f, 0.0f, 1.0f};
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
glEnableVertexAttribArray(0);
glDrawArrays(GL_TRIANGLES, 0, 4);
 }

当我运行应用程序时,背景会改变颜色,但三角形永远不会出现。知道我做错了什么吗?

问题似乎与着色器未编译...

shader = glCreateShader(type);
if (shader == 0){
#ifdef __APPLE__
    printf("Shader Failed %d\n", type);
#endif
    return 0;
}

打印出着色器失败(类型 = GL_VERTEX_SHADER)

我对此进行了评论,但仍然得到相同的响应,只有其他所有内容似乎都可以编译...

更新

我还看到以下警告,我不认为它是相关的,因为编译检查通过了,但是....

/Users/me/Development/test3/test3/game-gl.c:97:46:将“GLbyte [148]”传递给“const char *”类型的参数在指向具有不同符号的整数类型的指针之间进行转换

但正如我所说,这张支票似乎通过了......

glGetShaderiv(shader, GL_COMPILE_STATUS, &compiled);
if (!compiled) {

再次更新

好的,现在我们得到了一些地方......

programObject = glCreateProgram();
if(programObject == 0){
    printf("Invalid program returned \n");
}

打印出程序无效?!?!?!?

然后再次

所以我改为尝试抓取.m文件中的程序但它仍然是0。

if(_program == 0){
    NSLog(@"Still can not create program");
}
else{
    resizeViewport(screenWidth, screenHeight);
    InitializeOpenGL(0, 0, _program);
}
4

2 回答 2

0

对于 GLKViewController 您显然必须在获取程序之前设置上下文。添加此行...

[EAGLContext setCurrentContext:self.context];

在初始化 GL 之前让它工作。

于 2013-05-30T14:20:41.163 回答
0

你的着色器代码在哪里?您是否正在创建片段着色器?创建程序?链接?如果那没有编译,那么这就是你的第一个问题。但是您可以从 gl 获得有用的错误消息,这将对您有所帮助。

除此之外,您应该在分配数据之前启用属性指针。

另外,请确保您没有剔除顺时针方向的面(而不是 CCW)...如果您启用了面剔除功能。

于 2013-05-30T08:53:56.533 回答