2017-02-20 93 views
0

我想渲染一个在iOS上使用openGL的三角形。我有我的环境设置。我可以改变屏幕的背景颜色。我有一个基本的顶点和片段着色器,它们都可以成功编译并链接到程序。 glError()也报告没有错误。基本的三角形着色器不渲染

出于某种原因,我的三角形不呈现。

设置我的帧缓冲区和渲染缓冲区这样的:

glGenRenderbuffers(1, &_colorRenderBuffer); 
glBindRenderbuffer(GL_RENDERBUFFER, _colorRenderBuffer); 
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:drawable]; 

GLuint framebuffer; 
glGenFramebuffers(1, &framebuffer); 
glBindFramebuffer(GL_FRAMEBUFFER, framebuffer); 
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, 
          GL_RENDERBUFFER, _colorRenderBuffer); 

然后我定义我的三角形的三个顶点:

_triangleMatrix[0] = -1.0; _triangleMatrix[1] = 0.0; 
_triangleMatrix[2] = 0.0; _triangleMatrix[3] = 1.0; 
_triangleMatrix[4] = 1.0; _triangleMatrix[5] = 0.0; 

我创建并链接到我的着色器。我不打算在这里显示整个代码,因为我没有得到任何编译或链接错误:

[self createVertexShader]; 
[self createFragmentShader]; 
[self linkProgram]; 

然后我使用该程序,并获取属性“位置”插槽并启用它:

glUseProgram(_program); 
_position_slot = glGetAttribLocation(_program, "position"); 
glEnableVertexAttribArray(_position_slot); 

现在我需要设置我的VBO。这是我最不确定的部分。

glGenBuffers(1, &_vertex_buffer); 
glBindBuffer(GL_ARRAY_BUFFER, _vertex_buffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(_triangleMatrix), _triangleMatrix, GL_STATIC_DRAW); 

然后这里是我的render()方法:

glClear(GL_COLOR_BUFFER_BIT); 

    // 1rst attribute buffer : vertices 
    glVertexAttribPointer(
          _position_slot, 
          2,     // size 
          GL_FLOAT,   // type 
          GL_FALSE,   // normalized? 
          0,     // stride 
          (void*)0   // array buffer offset 
         ); 
    // Draw the triangle ! 
    glDrawArrays(GL_TRIANGLES, 0, 3); // Starting from vertex 0; 3 vertices total -> 1 triangle 
    glDisableVertexAttribArray(0); 
    [_context presentRenderbuffer:GL_RENDERBUFFER]; 

以下是编译顶点着色器代码:

NSString* vshader = \ 
@"attribute vec2 position; \ 
void main()\ 
{\ 
    gl_Position = vec4(position.x, position.y, 0.0, 1.0);\ 
}"; 

而片段着色器:

NSString* fshader = \ 
@"void main()\ 
{\ 
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);\ 
}"; 

基本上就是这样,整个文件你可以看看这个链接: https://gist.github.com/anonymous/6ed3f8231e76db35921ef260bfa6bf43

我想,问题是,我的顶点着色器是不是从我_triangleMatrix成员接受了“位置”的数据。所以要么属性设置不正确,要么_triangleMatrix的数据本身没有被openGL读取。无论如何,从我看过的每一个教程和指南,我相信我已经正确地设置了它,并且我不知所措。此外,glError()不会返回错误,并且每个可检查错误的着色器编译或链接进程都不会报告错误。

任何想法?

+0

glViewport()调用是我需要的。出于某种原因,我忽略了这一点,从未在各种教程中看到它。非常感谢。 – sugarmuff

回答

1

您缺少几件。

您错过的最重要的事情是设置视口:glViewport(x, y, width, height)应该设置为您的渲染缓冲区的大小。这定义了您正在绘制的缓冲区的哪一部分,并且必须手动设置。

第二个似乎是在绘制调用结束时禁用顶点属性数组,但是在调用开始时不启用顶点属性数组。在你的情况下,禁用并不是真的必要,只有在你使用着色器时启用它才有意义(glUseProgram)。但通常要确保您使用的所有属性都已启用。在你的代码中,三角形只绘制第一帧,然后在下一帧消失。